为什么默认情况下析构函数不是虚拟的

因为很多类并不是设计来作为基类使用的, 虚函数仅在用作派生类对象接口的类中有意义(通常分配在堆上并通过指针或引用访问)。

那么我什么时候应该声明一个析构函数为虚拟的呢? 每当该类具有至少一个虚函数时。 拥有虚函数表明一个类是作为一个派生类的接口,如果是派生类的对象可以通过指向基类的指针销毁。 例如:

class Base {
        // ...
        virtual ~Base();
    };

    class Derived : public Base {
        // ...
        ~Derived();
    };

    void f()
    {
        Base* p = new Derived;
        delete p;    // 用于确保调用 ~Derived 的虚拟析构函数
    }    

如果 Base 的析构函数不是虚拟的,Derived 的析构函数就不会被调用 - 可能产生不良影响,例如 Derived 拥有的资源不 被释放

 

posted @ 2023-02-17 20:24  朱英浩  阅读(17)  评论(0编辑  收藏  举报