Skip to content

虚析构函数 ​

虚析构用于确保通过基类指针删除派生类对象时,能正确调用派生类的析构函数。

问题场景 ​

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() {}  // 错误:构造函数不能是虚的
};