c++继承需显式指定访问控制符,默认private导致基类成员不可见;构造函数不继承,须手动转发;虚析构函数是安全底线,防止资源泄漏;重写函数签名须完全一致并加override。

基类定义必须有访问控制修饰符
没加 public、protected 或 private 的继承,默认是 private,这会让所有基类成员在派生类里变成私有,外部完全不可见——连调用都报错。
常见错误现象:error: 'xxx' is inaccessible,尤其在尝试访问基类的 public 成员函数时突然失败。
- 显式写
class Derived : public Base,除非你真需要私有继承(极少) - 多继承时每个基类都要单独标访问级别:
class D : public A, protected B -
struct默认继承是public,但别依赖这个,统一用class+ 显式修饰更安全
构造函数不能被继承,必须手动转发
C++11 之前根本不能“继承构造函数”,即使写了 using Base::Base;,也只是让派生类能用基类构造函数签名,实际仍需自己实现初始化逻辑。
使用场景:派生类没新增成员,或新增成员可默认构造,想复用基类初始化流程。
立即学习“C++免费学习笔记(深入)”;
- 基类有带参构造函数时,派生类构造函数必须用成员初始化列表调用它:
Derived(int x) : Base(x) { } - 如果基类构造函数是
explicit,派生类调用也必须显式,否则隐式转换会失败 - 忘记初始化基类成员(尤其是 const 或引用成员),编译直接报错:
member 'xxx' must be initialized by constructor
虚析构函数不是可选项,而是安全底线
基类指针指向派生类对象,delete 时若基类析构函数非 virtual,只会调用基类析构,派生类部分内存泄漏、资源不释放——而且通常不报错,只埋雷。
性能影响几乎为零,但兼容性极关键:只要类设计成被继承(哪怕暂时没子类),就该加 virtual。
- 基类析构函数声明为
virtual ~Base() = default;是最简安全写法 - 如果基类已有析构函数体,加
virtual关键字即可,不用改实现 - 纯虚析构函数也要提供定义:
virtual ~Base() = 0;后必须在 .cpp 里写Base::~Base() { }
派生类重写函数要小心 const 和引用限定符
看起来一样的函数签名,只差一个 const 或 &,C++ 就认为是不同函数——不会覆盖,而是隐藏,导致调用出乎意料。
常见错误现象:通过基类指针调用虚函数,结果执行了基类版本,而不是你写的派生类函数。
- 重写时函数签名(包括返回类型、参数、
const、&、&&)必须和基类完全一致 - 建议在派生类函数后加
override,编译器会检查是否真能覆盖:void foo() const override - 返回类型协变只允许指针/引用类型变窄(如
Base*→Derived*),其他情况会编译失败











