虚析构函数至关重要,它确保通过基类指针删除派生类对象时能正确调用派生类析构函数,避免资源泄漏;只要类可能被继承且需多态删除,析构函数就必须为虚。

虚析构函数之所以重要,是因为它能确保通过基类指针删除派生类对象时,派生类的析构函数被正确调用——否则只会调用基类析构函数,导致派生类中申请的资源(如堆内存、文件句柄等)无法释放,直接引发内存泄漏或资源泄漏。
多态删除场景下,非虚析构函数会跳过派生类清理逻辑
当用 基类指针指向堆上创建的派生类对象,并用 delete 释放时,C++ 默认只调用基类的析构函数(静态绑定)。如果基类析构函数不是虚函数,编译器不会查找并调用派生类的析构函数。
- 派生类中用
new分配的内存不会被delete - 自定义资源(如打开的文件、网络连接、锁)得不到释放
- 即使派生类析构函数里写了
std::cout ,你也看不到输出
只要类设计为基类(被继承)且支持多态删除,析构函数就必须是虚的
判断依据不是“有没有写 virtual”,而是“是否可能通过基类指针/引用管理派生类对象的生命周期”。常见情况包括:
- 类中有至少一个
virtual函数(比如virtual void draw() = 0;) - 类被明确作为接口或抽象基类使用(如
Shape,Logger,Handler) - 容器或工厂函数返回的是基类指针(如
std::unique_ptr<base>指向Derived)
此时,哪怕基类析构函数函数体为空,也应声明为 virtual ~Base() = default; 或 virtual ~Base() {}。
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~