1.虚析构函数
通过基类的指针删除派生类的对象时,通常情况下只调用基类的析构函数。
但是删除一个派生类的对象时,应该先调用派生类的析构函数,然后调用基类的析构函数。
2.解决办法:把基类的析构函数声明为virtual
派生类的析构函数可以virtual不进行声明
通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。
3.错误例子证明:
class son
{
public:
~son(){cout<<"bye from son"<<endl;};
};
class grandson:public son
{
public:
~grandson(){cout<<"bye from grandson"<<endl;};
};
int main()
{
son *pson;
pson=new grandson();
delete pson;
return 0;
}
//输出:bye from son
//所以并没有执行grandson::~grandson()