多层继承中成员访问权限由每层继承方式逐层限定,非简单叠加;public继承保持原访问级,protected/private继承分别降为protected/private且不可再继承;外部仅能访问最外层public成员,子类内部访问受限于当前作用域级别。

多层继承下成员访问权限不是简单叠加,而是逐层传递、逐层受限——最终能否访问,取决于每一层继承方式和原始访问限定的双重作用。
看每层继承方式对基类成员的“降级效果”
基类成员在派生类中的可见性,由它**在上一层派生类中已有的访问级别**,再结合**当前层的继承方式**共同决定。不是回溯到最顶层基类直接计算。
-
public继承:不改变上一层已有的访问级别(public→public,protected→protected) -
protected继承:把上一层所有可继承的成员(即非private)统一降为protected -
private继承:把上一层所有可继承的成员统一降为private,且后续无法再被进一步继承
例如:A 中有个 protected 成员 m;B : protected A → m 在 B 中仍是 protected;C : public B → m 在 C 中仍为 protected(因为 protected 成员经 public 继承不变)。
外部代码只能访问最外层派生类的 public 成员
无论中间经过多少层,main() 或其他非成员函数里,只能通过对象调用其**最外层类声明为 public 的成员**——包括从基类继承来、且未被降级为 protected 或 private 的那些。
立即学习“C++免费学习笔记(深入)”;
- 即使
A::func()原本是public,若B : private A,则B对象无法调用func() - 若
C : public B,但B已将func()降为private(比如B是私有继承自A),那C对象依然不能调用 - 想恢复访问?得在
B或C中用using A::func;显式提升
子类内部访问 ≠ 外部访问,且受“this 指向”严格限制
在派生类成员函数内部,能访问哪些基类成员,取决于该成员在**当前类作用域中的访问级别**,而非原始定义位置。
-
protected成员可在子类函数中通过this->m或直接m访问(仅限当前对象) - 但不能写
other.m(哪怕other是同类型对象),编译器会报错:'int Base::m' is protected within this context -
private成员在任何派生类中都不可见,连this->都不能用 - 注意:友元关系不继承,子类不会自动获得对父类
protected成员的额外访问权
真正容易被忽略的是:多层继承中,某一层用了 protected 或 private 继承,就相当于在那一层“关了一道门”,后面所有层级都无法再绕过——除非用 using 显式开门,或重构继承结构。别指望靠最后一层 public 继承来“翻盘”。


















