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

C++继承访问限定符问题:为何子类对象无法访问成员c?

为什么d2.c会因protected权限报错?

先看完整代码:

#include <iostream>
using namespace std;

class B {
    private:
        int a=1;
    protected:
        int b=2;
    public:
        int c=3;
};

class D : protected B { // 条款1
};

class D2 : public D { // 条款2
    void x() {
       c=2;
    }
};

int main() {
    D d;
    D2 d2;
    cout << d2.c; // 条款3 因c为protected报错
    return 0;
}

核心误区纠正

你的第2条理解错误:D2以public继承D时,并不会将D中protected的成员c改为public权限。

逐条款解析权限变化

  • 条款1:D以protected方式继承B时,B的所有public、protected成员都会被继承为D的protected成员。所以B中原本public的c,在D里变成了protected属性。
  • 条款2:D2以public方式继承D时,D中的protected成员(包括c)在D2中仍然保持protected属性。只有基类的public成员在public继承下才会保持public属性,protected成员无论哪种继承方式(除private继承会变为private),在派生类中都不会提升为public。
  • 条款3:main属于类外部作用域,无法直接访问类的protected成员。d2.c试图从外部访问D2的protected成员c,因此触发编译错误。

如何让外部访问d2.c?

如果需要让外部能访问D2的c,可以在D2中显式将c声明为public:

class D2 : public D {
public:
    using B::c; // 重新引入c并设置为public
    void x() {
       c=2;
    }
};

内容的提问来源于stack exchange,提问作者yapkm01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:50:33