C++派生类声明时省略访问修饰符默认为private继承,导致基类成员在派生类中全变为私有,外部不可访问;构造函数不自动继承,需显式调用;虚函数必须在基类声明virtual并建议派生类加override;多态删除需virtual析构函数;值传递引发对象切片。

派生类声明时忘记写访问修饰符会怎样
不写 public、private 或 protected,C++ 默认按 private 继承——这意味着基类所有成员在派生类里都变成私有,外部无法访问,连 public 成员函数也“不可见”。这不是编译错误,但后续调用会报 error: 'xxx' is inaccessible。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 始终显式写出继承方式,哪怕你真想用
private继承 - 90% 以上场景该用
public继承,否则就不是“is-a”关系,该考虑组合或protected - 别依赖默认行为,不同编译器对模板或嵌套类里的隐式继承处理可能不一致
构造函数不能自动继承,必须手动转发
派生类不会自动生成调用基类构造函数的版本。如果基类构造函数带参数,而你又没定义派生类构造函数,或者定义了但没显式调用基类构造函数,编译直接失败:error: no matching function for call to 'Base::Base()'(因为基类没默认构造函数)。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 用委托构造(C++11 起):在派生类构造函数初始化列表里写
: Base(arg) - 避免在构造函数体里赋值代替初始化列表——基类子对象必须在进入函数体前构造完毕
- 若基类有多个构造函数,且你想让派生类“看起来”也支持这些签名,得一个个写,或用
using Base::Base(C++11 起),但注意它只继承非模板、非默认/拷贝/移动构造函数
虚函数没加 virtual 导致多态失效
基类函数没声明 virtual,即使派生类写了同名同参函数,通过基类指针调用时仍绑定到基类实现,不是你期望的“运行时决定”。现象是:明明重写了函数,结果调的还是父类的。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 只要打算被重写,基类函数必须加
virtual;C++11 起建议派生类函数加override,编译器能帮你检查签名是否真匹配 -
virtual只影响通过指针或引用的调用;直接用对象调用仍是静态绑定 - 析构函数如果基类可能被多态删除,必须声明为
virtual,否则派生类部分内存不释放——这是最常漏掉的虚函数
派生类对象赋值给基类对象会发生切片
写 Base b = Derived(); 或传值调用 func(Base b) 时,派生类独有的成员和虚表指针全被丢弃,只剩基类部分。这不是警告,是静默截断,后续任何多态行为都失效。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 除非明确要复制基类子对象,否则一律用引用或指针传递:
func(const Base& b)或func(Base* b) - 切片后对象的
typeid是Base,dynamic_cast也会失败 - 容器如
std::vector<base>存派生类对象?别这么干——存std::unique_ptr<base>才对
继承本身不难,难的是每一步都得对齐语义:访问控制决定接口可见性,构造逻辑决定对象怎么诞生,虚函数决定行为怎么分发,而值传递这一步稍不注意,整个继承链就当场“断开”。









