有以下定义
class CA
{
public:
CA(){}
~CA(){ cout << "destruction CA" << endl; }
};
class CB:public CA
{
public:
CB(){}
~CB(){ cout << "destruction CB" << endl;}
};
class CC:public CB
{
public:
CC(){}
~CC(){ cout << "destruction CC" << endl;}
};
考虑如下代码
CA *a = new CC();
delete a;
让我们看一下结果:destruction CA
哦!你可能看到了,只有CA的析构函数被调用,假如CB,CC的析构函数内有delete 操作,内存泄露看来是不可避免的。那么假如CA的析构函数为虚函数又会怎么样呢?
class CA
{
public:
CA(){}
virtual ~CA(){ cout << "destruction CA" << endl; }
};
再看一下结果:
destruction CC
destruction CB
destruction CA
每一个类的析构函数都被调用了。析构顺序是这样的:
首先从CC开始析构,在完成CC析构函数的全部操作并结束析构之前调用CB析构函数,在完成CB析构函数的全部操作并结束析构之前调用CA析构函数,由于CA函数为最基本的类,CA析构函数在完成全部操作后就直接结束了,然后结束的是CB析构函数,最后结束的是CC析构函数。所以子类的析构函数运行时间要长与父类析构函数的运行时间。
若CA的析构函数不是虚函数,CB或CC的析构函数却为虚函数,结果会怎么样?答案是编译器出错,错误信息是:BLOCK_TYPE_IS_VALID为什么出错呢?你知道吗?我暂时还没搞清楚J。