#include <iostream>
using namespace std;
class BaseA
{
public:
BaseA(){cout <<"BaseA::BaseA()" <<endl;}
~BaseA(){cout <<"BaseA::~BaseA()" <<endl;}
};
class DevA : public BaseA
{
public:
DevA(){ p = new char[10];cout <<"DevA::DevA()" <<endl;}
~DevA(){ delete[] p;cout <<"DevA::~DevA()" <<endl;}
private:
char *p;
};
int main(){BaseA *a = new DevA();delete a;return 0;}
在上面的例子中它不会调用DevA类中的析构函数,其实这种情况先有肯发生能出泄露。假设我DevA像下列声明:
class DevA : public BaseA
{
public:
DevA(){p = new char[10]; cout <<"DevA::DevA()" <<endl;}
~DevA(){delete[] p; cout <<"DevA::~DevA()" <<endl;} private: char *p;
};
那么指针p的内存将得不到回收。为什么p的内存没有被回收,因为程序没有调用DevA的析构函数所以碰到这种问题我们只需将
BaseA的析构函数声明为virtual就行,这样在delete a时他会被动态绑定调用DevA的析构函数。当然不是所有类的析构函数都要virtual
所以基本的一条是,无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。
当然上述方法不是一条定理,能适用于所有的地方,本文的第二个例子就不适用。