我们知道, C++中经常用到多态, 经常用基类指针指向派生类对象, 所以下面程序有bug:
#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout << "A destructor" << endl;
}
};
class B : public A
{
public:
~B()
{
cout << "B destructor" << endl;
}
};
int main()
{
A *p = new B;
delete p; // bug, 只调用到了基类A的析构函数, 不符合预期
return 0;
}
加上虚析构后会一路走到底去析构:
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
cout << "A destructor" << endl;
}
};
class B : public A
{
public:
~B()
{
cout << "B destructor" << endl;
}
};
int main()
{
A *p = new B;
delete p; // ok, 会先后调用B,A的析构函数
return 0;
}
可见, 析构函数通常要虚。如果不把析构函数设置为虚函数, 会不知不觉地引起很多错误, 比如最常见最可让人伤心的内存泄露。