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

C++继承误区:子类调用基类私有成员相关疑问

关于C++私有成员与继承成员函数访问权限的原理解答

咱们先把你给出的代码贴出来,方便对照分析:

class A{ 
private: 
    int a; 
public: 
    void abc() { cout << a << endl; } 
};
class B : public A { };
main() { 
    B obj; 
    obj.abc(); 
}

你观察到obj.abc()能正常运行,疑问点在于:基类A的a是私有成员,子类B没法直接访问,为啥继承来的abc()却能输出a?其实核心在于C++的访问权限规则是基于「类的作用域」,而不是「对象的类型」,咱们拆开来理清楚:

  • 首先明确私有成员的访问规则:private成员只能被定义它的类本身直接访问,子类、外部对象都不能直接碰它。但abc()是A类的公有成员函数,它是在A的类作用域里定义的,所以它天生就拥有访问A类所有成员(包括私有成员a)的权限——这个权限是函数诞生时就确定的,和谁调用它没关系。
  • 子类B以public方式继承A时,会把A的公有成员(也就是abc())继承过来,变成自己的公有成员。这相当于B拿到了一个“授权工具”:这个工具的内部逻辑是A写的,自带访问A私有成员的权限,B只需要调用它就行,不需要自己去碰私有成员a。
  • 打个生活化的比方:A是你家,a是家里的私房钱(私有),abc()是你爸妈写好的一个“查私房钱余额”的小程序(公有)。你(子类B)不能直接翻爸妈的私房钱,但你可以用爸妈给你的这个小程序——小程序是爸妈做的,自然能拿到私房钱的信息,你只需要运行它就能看到结果,完全合法。

总结一下:子类B确实不能直接访问A的私有成员a,但它继承的abc()是A类的成员函数,本身就有访问a的权限,所以当B的对象调用abc()时,函数是在A的权限范围内执行访问操作,完全符合C++的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:42