虚析构函数确保通过基类指针删除派生类对象时,派生类的析构函数能被正确调用,避免资源泄漏。2. 若基类析构函数非虚,则delete基类指针时仅调用基类析构函数,派生类部分无法清理。

在C++中,虚析构函数主要用于解决通过基类指针删除派生类对象时可能引发的资源泄漏问题。当一个类被用作多态基类时,定义虚析构函数是良好的编程实践。
为什么需要虚析构函数
如果基类的析构函数不是虚函数,而你用基类指针指向派生类对象,并调用delete,那么只有基类的析构函数会被调用,派生类的析构函数不会执行。这会导致派生类中分配的资源无法正确释放。
例如:
class Base {
public:
~Base() { cout << "Base destroyed"; }
};
class Derived : public Base {
public:
~Derived() { cout << "Derived destroyed"; }
};
Base* ptr = new Derived();
delete ptr; // 只调用 ~Base(),~Derived() 不会被调用!
输出只有“Base destroyed”,造成不完整清理。
立即学习“C++免费学习笔记(深入)”;
如何实现虚析构函数
只需在基类的析构函数前加上 virtual 关键字即可:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
class Base {
public:
virtual ~Base() {
cout << "Base destroyed";
}
};
class Derived : public Base {
public:
~Derived() override {
cout << "Derived destroyed";
}
};
此时再执行:
Base* ptr = new Derived(); delete ptr;
会先调用 ~Derived(),再调用 ~Base(),确保完整析构。
虚析构函数的作用总结
- 保证通过基类指针删除派生类对象时,能正确调用整个继承链上的析构函数
- 防止资源泄漏(如内存、文件句柄、锁等)
- 只要类有虚函数且可能被继承,就应将析构函数设为虚函数
- 即使析构函数为空,也建议声明为虚函数以支持安全的多态删除
注意:纯虚析构函数也是允许的,但必须提供定义:
class Base {
public:
virtual ~Base() = 0;
};
// 必须在某处实现
Base::~Base() {}
基本上就这些。虚析构函数不复杂,但在多态使用中至关重要。只要涉及继承和指针删除,记得加 virtual 就对了。










