为何C++ using声明无法将基类protected成员暴露为派生类public成员?
为什么using声明无法将基类protected构造函数暴露为派生类public成员?
首先要明确:using声明对构造函数的权限处理规则,和普通成员完全不同。
对于普通的成员函数或成员变量,using声明确实可以改变它们在派生类中的访问权限——比如把基类的protected成员在派生类中声明为public,外部就能直接访问。但构造函数是特殊情况,C++标准明确规定:当你用using A::A;引入基类构造函数时,派生类中这个构造函数的访问权限,由基类构造函数的权限和派生类的继承方式共同决定,不会继承using声明所在访问块(比如这里的public)的权限。
回到你的代码:
- 基类A的构造函数是protected权限
- B以public方式继承A,基类的protected成员在派生类中依然是protected权限
- 哪怕你把
using A::A;写在B的public块里,这个引入的构造函数的权限还是protected,所以外部的main函数无法直接调用它来实例化B对象。
如果想让外部能通过这个构造方式创建B对象,你需要手动在派生类中定义一个public构造函数,显式调用基类的构造函数:
class B : public A { public: B(int a, int b) : A(a, b) {} // 手动定义public构造函数,调用基类protected构造 };
这样main函数里的B(1, 2);就能正常编译运行了。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

