虚析构函数
虚析构用于确保通过基类指针删除派生类对象时,能正确调用派生类的析构函数。
问题场景
cpp
class Base {
public:
~Base() { cout << "Base destroyed" << endl; }
};
class Derived : public Base {
public:
~Derived() { cout << "Derived destroyed" << endl; }
};
int main() {
Base* ptr = new Derived();
delete ptr;
// 输出:Base destroyed
// 问题:Derived 的析构函数没有被调用
}解决方案:虚析构函数
cpp
class Base {
public:
virtual ~Base() { cout << "Base destroyed" << endl; }
};
class Derived : public Base {
public:
~Derived() { cout << "Derived destroyed" << endl; }
};
int main() {
Base* ptr = new Derived();
delete ptr;
// 输出:
// Derived destroyed
// Base destroyed
}使用规则
cpp
// 1. 基类有虚函数 -> 析构函数应为 virtual
class Base {
public:
virtual void foo() {} // 有虚函数
virtual ~Base() {} // 析构函数也应 virtual
};
// 2. 纯虚析构函数
// 可以声明纯虚析构函数,使类成为抽象类:
class AbstractBase {
public:
virtual ~AbstractBase() = 0; // 纯虚
};
// 必须提供定义(即使不做什么)
AbstractBase::~AbstractBase() {}
// 3. 构造函数不能是虚的,但析构函数可以
class Base {
public:
virtual ~Base() = default; // OK
// virtual Base() {} // 错误:构造函数不能是虚的
};