考虑以下类的结构:
class Base { public: Base(){} ~Base(){} virtual void doSth(){} }; class Derived:public Base { public: Derived(){} ~Derived(){} void doSth(){} };
假设接下来有如下代码:
Base* b=new Derived; delete b;
那么当进行到delete b这一句的时候会发生内存泄露。因为C++明确指出,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果是未定义的,通常发生的是对象的derived class成分未被销毁。
消除这个问题的做法是给base class一个virtual的析构函数:
class Base { public: Base(){} virtual ~Base(){} virtual void doSth(){} };
一般而言,只有当基类具有virtual函数,或者说是为了具备多态性的时候,才有必要声明virtual的析构函数。