虚析构函数是为了解决这样问题:
基类的指针指向派生类对象,并用基类的指针删除派生类对象。
由于派生类的析构函数会被编译器扩展,以静态的方式依次调用上层的析构函数,故而出现下面的结果。
如果为非虚函数将只调用:相应指针的析构函数,此析构函数任然是被扩展的。(借鉴-深度探索c++对象模型)
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A(){cout<<"A~"<<endl;}
};
class A1:public A
{
public:
~A1(){cout<<"A1~"<<endl;}
};
class A2:public A1
{
~A2(){cout<<"A2~"<<endl;}
};
int main()
{
A* a = new A2;
delete a;
return 1;
}
输出:
A2~
A1~
A~
在以上的基础可以测试,去掉virtual等操作。