【C/C++】析构函数好玩的用法:~Derived() override
文章目录
- 析构函数好玩的用法:~Derived() override
- 正确使用 `override` 修饰析构函数的前提
- 示例
- 错误使用:基类析构函数不是 virtual
- 使用 `override` 修饰析构函数的作用和好处
- 总结
析构函数好玩的用法:~Derived() override
在 C++ 中,override
关键字的主要作用是用于标识虚函数重写(重载)基类中的虚函数。对于析构函数而言,是否可以加 override
,取决于基类的析构函数是否是虚的。
正确使用 override
修饰析构函数的前提
基类析构函数是 virtual
的,并且你在派生类中重写它。
示例
class Base {
public:virtual ~Base() {} // 基类的析构函数是虚的
};class Derived : public Base {
public:~Derived() override { // 正确:重写了 Base 的虚析构函数// 清理资源}
};
这个写法是合法的,override
告诉编译器你是显式重写了一个虚函数,避免写错函数签名而导致的隐藏错误。
错误使用:基类析构函数不是 virtual
class Base {
public:~Base() {} // 不是 virtual
};class Derived : public Base {
public:~Derived() override {} // ❌ 错误:基类没有虚析构函数
};
这种情况下编译会报错:
error: 'Derived::~Derived' marked 'override', but does not override
使用 override
修饰析构函数的作用和好处
- 防止签名错误:编译器会检查你是否真的重写了基类的虚函数(即签名必须完全匹配)。
- 更安全的多态析构:当你通过基类指针释放派生类对象时,确保调用派生类的析构函数。
总结
条件 | 是否可以 override 析构函数 |
---|---|
基类析构函数是 virtual | ✅ 可以使用 override |
基类析构函数不是 virtual | ❌ 不可以使用 override,会编译错误 |
如无特殊需求,建议始终为有继承关系的基类添加 virtual
析构函数,并在派生类中使用 override
,以保证正确的析构顺序。