什么时候才应该将析构函数定义为虚拟呢?当类至少拥有一个虚拟函数时。拥有虚拟函数意味着一个类是派生类的接口,在这种情况下,一个派生类的对象可能通过一个基类指针来销毁。
如果基类的析构函数不是虚拟的,那么派生类的析构函数将不会被调用。
#include <iostream>
using namespace std;
class A
{
public:
A(){
cout << "A construction" << endl;
}
virtual ~A() //注意这里
{
cout << "A destruction" << endl;
}
};
class B: public A{
public:
B(){
cout << "B construction" << endl;
}
~B(){
cout << "B destruction" << endl;
}
};
void main(){
{
B pg;
}
cout << "---------------------------" << endl;
{
A *pe = new B( );
delete pe;
}
}
程序运行结果:
A construction
B construction
B destruction
A destruction
---------------------------
A construction
B construction
B destruction
A destruction
如果去掉 virtual 结果为:
A construction
B construction
B destruction
A destruction
---------------------------
A construction
B construction
A destruction