析构函数可用override,因其本质是特殊虚函数;加override可编译期校验基类是否真有virtual析构函数,防止资源泄漏。

可以,而且推荐在虚析构函数声明后加上 override。
为什么析构函数能用 override
析构函数本质是特殊的虚函数——只要基类析构函数声明为 virtual,它就参与虚函数重写机制。派生类中同名的析构函数(即使没写 virtual)默认也是虚的,且自动重写基类虚析构函数。
所以只要满足 override 的基本条件:
- 基类有 virtual 析构函数
- 派生类析构函数签名与之完全一致(析构函数无参数、无返回值,天然匹配)
- 写在成员函数声明末尾(~Derived() override;)
编译器就会接受,并进行校验。
~Base() override 会检查什么
虽然析构函数没有参数列表可出错,但 override 仍会严格验证:
- 基类是否真有 virtual ~Base()(拼错类名、遗漏 virtual 都会报错)
- 是否在正确的作用域内(比如私有继承时不可见,或访问权限不足)
- 是否被 final 修饰(若基类析构函数带 final,加 override 会直接失败)
常见错误现象:
- error: '~Derived' does not override a base class member → 基类没写 virtual ~Base()
- error: overriding final function → 基类析构函数用了 final
- 没报错但多态删除时调不到派生类析构 → 很可能忘了基类 virtual,而你又没加 override,导致问题潜伏到运行时
不加 override 的风险
不加 override 时,编译器不会提醒你基类析构函数是否真的虚——哪怕你误写了 ~Base() {}(非虚),派生类写 ~Derived() {} 也完全合法,但 delete ptr_to_base 时只调基类析构,资源泄漏静默发生。
加了 override 后,这类疏漏会在编译期暴露:
- 基类析构不是虚的 → 直接报错
- 类名/作用域写错 → 找不到基类虚析构 → 报错
- 继承关系断裂(如中间某层没传递虚析构)→ 报错
示例:
struct Base {
virtual ~Base() = default; // 必须 virtual
};
struct Derived : Base {
~Derived() override; // ✅ 正确:显式要求重写,编译器校验通过
};
// 若把 Base 的 virtual 去掉,这里立刻编译失败
真正容易被忽略的是:析构函数的 override 不是“锦上添花”,而是和基类 virtual 一起构成多态销毁安全的最小闭环——漏掉任意一环,都可能让对象生命周期管理失效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











