在析构函数前面加上关键字virtual进行说明,则称该析构函数为虚析构函数。例如:
class B
{
public:
virtual ~B();
};
该类中的析构函数就是一个虚析构函数。
如果一个基类的析构函数被说明为虚析构函数,则派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。
说明虚析构函数的目的在于使用delete运算符删除一个对象时,能保证析构函数被正确地执行。因为设置虚析构函数后,可以使用动态联编方式选择析构函数。
例如,以下c程序:
#include <iostream>
class A //抽象类
{
public:
//virtual ~A()
~A()
{
cout << "调用A::~A()" << endl; //虚析构函数
}
};
class B:public A
{
char *buf;
public:
B(int i){buf = new char[i];}
virtual ~B()
{
delete []buf;
cout << "调用B::~B()" << endl;
}
};
void fun(A *a)
{
delete a;
}
int main()
{
A *a = new B(10);
fun(a);
}
程序运行结果如下:
如果A中的析构函数不用虚函数,则输出结果为:
这是因为基类的析构函数说明为虚函数时,调用fun(a)函数,执行delete a;语句时采用动态联编,调用它的基类的析构函数,所以输出上述结果。当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,也就是不调用它的基类的析构函数。