c++关于构造函数的一个小问题,希望高手不惜赐教,谢谢了。

来源:百度知道 编辑:UC知道 时间:2024/05/29 03:24:22
#include<iostream>
using namespace std;
class Base{
protected:
Base(){cout<<'A';}
Base(char c){cout<<c;}
};
class Derived:public Base{
public:
Derived(char c){cout<<c;}
};
int main(){
Derived d1('B');
return 0;
}
基类的构造函数居然是保护类型的,我想问一下为什么不是共有的也能执行啊?,如果实例化的是基类的对象,保护型的可以自动构造吗?如果是私有声明的构造函数,它的基类对象和派生类对象能调用不能啊?谢谢了。

由于声明为保护,在外部不可见,所以禁止直接实例化基类的对象
如果写Base b1('A');会报错的
派生类在构造时先执行基类的构造函数,但保护的构造函数在派生类中是可见的,所以可以实例化派生类的对象

如果是私有的构造函数,就禁止以任何方式调用了,这种情况通常用于例如对一个不希望进行复制的类,将其拷贝构造函数声明为私有

基类的两个构造函数都为protected就是说外部不能直接实例化基类对象了啦,也就是说如果在main中使用new Base()的话是不能通过编译的。
而其子类Derived由于可以访问基类的保护成员,所以可以实例化。如果基类构造函数声明为private的话,不仅外部(比如main函数)不能实例化它,其派生类Derived应该也不能被实例化了。
把构造函数声明的保护或私有,一般是在该类不想被外部实例化的情况下使用的,比如单例模式里就要防止类被外部实例化。在这些情况下,保护或私有构造函数还是有必要的。