千万不要将析构函数和虚函数混淆起来。
不管析构函数是不是虚函数,将析构函数设为虚函数是希望在通过基类指针删除派生类对象时调用派生类的析构函数。
如果析构函数不是虚函数,派生类对象没有Vptr,编译器会调用基类的析构函数(在编译时就确定了)。
这样,用户在派生类析构函数中填写的代码就不会被调用,派生类成员对象的析构函数也不会被调用。不过,派生类对象空间还是会被正确释放的,堆管理程序知道对象分配了多少空间。
#include <iostream>
using namespace std;
class B{
public:
B(){
cout<<"B"<<endl;
}
virtual ~B(){
cout<<"~B"<<endl;
}
};
class D:public B{
public:
D(){
cout<<"D"<<endl;
}
virtual ~D(){
cout<<"~D"<<endl;
}
};
int main()
{
B *pb=new D;
delete pb;
return 0;
}
输出结果:
B
D
~D
~B
如果将析构函数的virtual关键词去掉,则输出结果为:
B
D
~B
即对象D 没有调用析构函数,没有被析构