You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:34:55