虚析构函数是什么?
虚析构函数 就是在基类中声明为 virtual 的析构函数:
cpp
class Base {
public:
virtual ~Base() = default;
};
它的核心作用是:
当通过基类指针 删除一个派生类对象时,能够正确调用派生类的析构函数,然后再调用基类的析构函数。
如果基类析构函数不是虚函数,那么:
cpp
Base* p = new Derived;
delete p;
这是未定义行为 。很多情况下只会调用 Base::~Base(),而不会调用 Derived::~Derived(),导致派生类资源泄漏。
cpp
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base 构造\n";
}
virtual ~Base() {
std::cout << "Base 析构\n";
}
};
class Derived : public Base {
public:
Derived() {
data = new int[10];
std::cout << "Derived 构造,申请资源\n";
}
~Derived() override {
delete[] data;
std::cout << "Derived 析构,释放资源\n";
}
private:
int* data = nullptr;
};
int main() {
std::cout << "创建 Derived 对象,用 Base* 保存\n";
Base* p = new Derived;
std::cout << "通过 Base* 删除对象\n";
delete p;
std::cout << "程序结束\n";
return 0;
}