验证继承行为最可靠的方式是直接编译运行并检查访问权限和对象布局;public继承保持公有成员可外部访问、保护成员仅派生类内可访、私有成员不可见;private继承使所有基类成员在派生类中变为private;私有成员虽不可访问但参与内存布局,可用sizeof验证;构造时须显式调用基类带参构造函数,析构顺序为派生类先于基类;private/protected继承破坏类型兼容性,导致多态失效。

直接编译运行并检查访问权限和对象布局,是验证继承行为最可靠的方式。靠“看代码逻辑”或“想当然”容易漏掉底层细节。
编译时检查基类成员在派生类中的可访问性
关键不是“写了继承”,而是“能不能用”。public、protected、private 三种继承方式对基类成员的访问控制完全不同,必须逐项实测。
-
public继承下:Base::public成员在派生类中仍是public,可被外部调用;Base::protected成员变为派生类的protected,只能在派生类内部或友元中访问;Base::private始终不可见(哪怕继承了也访问不到) -
private继承下:所有可继承的基类成员(public/protected)在派生类中都变成private,连派生类的子类都无法访问 - 写个最小测试函数,在派生类内部尝试读写各权限成员,编译报错位置就是最真实的“可见性边界”
用 sizeof 验证私有成员是否被继承
很多人误以为 private 成员不参与继承——其实它们被继承了,只是不可访问,且占用内存。这是验证继承是否“物理发生”的硬指标。
- 定义一个只有
private成员的基类,比如class Base { private: int a; char b; };,打印sizeof(Base) - 再定义
class Derived : public Base { int c; };,打印sizeof(Derived) - 如果
sizeof(Derived) == sizeof(Base) + sizeof(int)(考虑对齐),说明Base的私有成员确实在对象内存中存在 - 若结果不符,可能是编译器优化(如空基类优化),但绝大多数非空
private成员都会计入大小
检查构造函数调用顺序与初始化列表行为
继承不是“复制粘贴”,而是对象构建时的协作过程。新增派生类后,若没显式调用基类构造函数,而基类又没有默认构造函数,就会编译失败。
立即学习“C++免费学习笔记(深入)”;
- 基类只有带参构造函数时,派生类构造函数必须在初始化列表中显式调用:
Derived(int x) : Base(x) { } - 不写初始化列表、也不提供基类默认构造函数 → 编译错误:
no matching function for call to 'Base::Base()' - 在构造函数体里用
Base(x)是无效的(那只是临时对象),必须写在冒号后 - 析构顺序永远是派生类先于基类,可用带输出的构造/析构函数直观验证
最容易被忽略的是:继承方式不仅影响代码能否编译,还决定类型兼容性。比如 private 或 protected 继承后,派生类对象不能隐式转为基类指针/引用——这会让多态失效,但编译器不会报错,只会在运行时出问题。


















