C++中using继承基类构造函数时为何仅默认构造变为public?
问题现象解释
你观察到的结果是C++两条核心规则共同作用的结果,和using Base::Base的权限逻辑没有冲突:
1. 为什么d1可以正常构造
当派生类没有显式声明默认构造函数时,编译器会自动生成一个public的隐式默认构造函数Derive::Derive()。这个构造函数属于派生类的成员,有权限调用基类的protected默认构造函数Base(),所以你在main函数中调用public的派生类默认构造函数是合法的。
这里的d1完全没有用到using Base::Base继承来的构造函数:C++规定如果派生类已经存在和继承构造函数同签名的构造函数,继承来的同签名构造函数会被自动隐藏,所以基类的默认构造函数根本没有被继承到派生类的公开接口中。
2. 为什么d2无法构造
Derive本身没有声明带int参数的构造函数,所以using Base::Base确实会把基类的Base(int)继承为派生类的Derive(int)构造函数。
但基类的Base(int)本身是protected权限,继承来的构造函数会保留基类原有的访问权限,也就是说Derive(int)仍然是protected的,只能在Derive类内部或者Derive的子类中调用,你在类外的main函数调用这个protected构造函数属于非法访问,自然编译失败。
解决方案
如果要让带int参数的构造函数可以在类外调用,你需要显式声明派生类的对应构造函数,不能依赖继承构造函数的隐式权限调整:
struct Derive : public Base { public: Derive() = default; // 显式声明public的带参构造函数,调用基类构造函数 Derive(int x) : Base(x) {} };
内容的提问来源于stack exchange,提问作者Wei Li
相关产品推荐
相关产品推荐

