虚析构函数
在C++中不能声明虚构造函数,但是可以声明虚析构函数。析构函数没有类型,也没有参数,和普通的函数成员相比,虚析构函数的情况略为简单些。
虚析构函数的声明语法为:
virtual ~类名();
如果一个类的析构函数是虚函数,那么由它派生的所有子类的析构函数也是虚函数。析构函数声明为虚函数后,在使用指针或引用时可以动态绑定,实现运行时的多台,保证使用基类类型的指针就能调用适当的析构函数针对不同的对象进行清理操作。
虚析构函数的使用
当你有可能通过基类指针调用对象的析构函数时,就需要让基类的析构函数称为虚函数,否则会产生不确定的后果。
示例
#include <iostream>
using namespace std;
class Base
{
public:
~Base();
};
Base::~Base() {
cout << "Base desturctor" << endl;
}
class Derived : public Base
{
public:
Derived();
~Derived();
private:
int *p;
};
Derived::Derived() {
p = new int(0);
}
Derived::~Derived() {
cout << "Derived destructor" << endl;
delete p;
}
void fun(Base *b) {
delete b;
}
int main()
{
Base *b = new Derived();
fun(b);
return 0;
}
输出结果为:
Base destructor
可以看到通过基类指针删除派生类对象时,并没有调用派生类对象的析构函数,也就意味着派生类Derived中的成员p,没有被删除,内存空间没有得到释放,造成了内存泄露。为了避免上面的错误发生,需要将基类的析构函数声明为虚函数即:
class Base {
public:
virtual ~Base();
};
修改后程序输出信息为:
Derived destructor
Base desturctor