【C/C++】析构函数好玩的用法:~Derived() override

文章目录

  • [析构函数好玩的用法:~Derived() override](#析构函数好玩的用法:~Derived() override)
    • [正确使用 `override` 修饰析构函数的前提](#正确使用 override 修饰析构函数的前提)
    • [错误使用:基类析构函数不是 virtual](#错误使用:基类析构函数不是 virtual)
    • [使用 `override` 修饰析构函数的作用和好处](#使用 override 修饰析构函数的作用和好处)
    • 总结

析构函数好玩的用法:~Derived() override

在 C++ 中,override 关键字的主要作用是用于标识虚函数重写(重载)基类中的虚函数 。对于析构函数而言,是否可以加 override,取决于基类的析构函数是否是虚的。


正确使用 override 修饰析构函数的前提

基类析构函数是 virtual 的,并且你在派生类中重写它。

示例

cpp 复制代码
class Base {
public:
    virtual ~Base() {}  // 基类的析构函数是虚的
};

class Derived : public Base {
public:
    ~Derived() override {  // 正确:重写了 Base 的虚析构函数
        // 清理资源
    }
};

这个写法是合法的,override 告诉编译器你是显式重写了一个虚函数,避免写错函数签名而导致的隐藏错误。


错误使用:基类析构函数不是 virtual

cpp 复制代码
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,以保证正确的析构顺序。

相关推荐
Chengbei115 分钟前
JsOwl|AI 赋能 JS 敏感信息扫描器,AST + 正则、source‑map 源码还原、登录态爬虫输出交互式 HTML 报告
开发语言·javascript·网络·人工智能·爬虫·网络安全·自动化
David猪大卫8 分钟前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
geovindu10 分钟前
rust: Iterator Pattern
开发语言·后端·设计模式·rust·行为模式·迭代器模
SDWAN_Cheap35 分钟前
深度解析什么是CDN加速:从原理到实践的技术拆解
开发语言·cdn加速
鬼手点金36 分钟前
模型即 Agent:当模型本身成为产品
开发语言·前端·人工智能·python·机器学习
SunnyDays101143 分钟前
如何使用 Java 提取 PPT 中的文字:整份文档、指定幻灯片与表格内容
java·powerpoint
毕设单片机1 小时前
springboot志愿服务平台的设计与实现 36731
java·spring boot·mysql·志愿服务平台
染指11101 小时前
147.Agent-LangGraph归并函数
开发语言·人工智能·python·langchain·agents
IT_Octopus1 小时前
【零基础入门 LLM 开发 · Day 15】:LangChain 注册工具——告别手写 JSON Schema
java·langchain·json