为什么默认情况下析构函数不是虚拟的
因为很多类并不是设计来作为基类使用的, 虚函数仅在用作派生类对象接口的类中有意义(通常分配在堆上并通过指针或引用访问)。
那么我什么时候应该声明一个析构函数为虚拟的呢? 每当该类具有至少一个虚函数时。 拥有虚函数表明一个类是作为一个派生类的接口,如果是派生类的对象可以通过指向基类的指针销毁。 例如:
class Base { // ... virtual ~Base(); }; class Derived : public Base { // ... ~Derived(); }; void f() { Base* p = new Derived; delete p; // 用于确保调用 ~Derived 的虚拟析构函数 }
如果 Base 的析构函数不是虚拟的,Derived 的析构函数就不会被调用 - 可能产生不良影响,例如 Derived 拥有的资源不 被释放