C++析构函数加上virtual是为了防止内存泄漏。
用在C++实现多态的时候,其基类要加virtual。
原因跟动态绑定有关,大家都知道,多态是通过虚函数实现的,而虚函数又是通过动态绑定实现的。
先举个例子:
class Base
{
public:
virtual void function()
{
cout<<"this is Base's function"<<endl;
}
virtual ~Base()
{
cout<<"this is Base's destroy"<<endl;
}
};
class Derived:public Base
{
public:
void function()
{
cout<<"this is Derived's function"<<endl;
}
~Derived()
{
cout<<"this is Derived's destroy"<<endl;
}
};
int main()
{
Base *ptr = new Derived();
ptr->function();
delete ptr;
return 0;
}
上面的代码,我先写了虚函数function,第31行就是动态绑定,而33行delete删除的是Base型基类指针,此指针是没有派生类Derived的析构函数的,所以如果不在基类的析构函数加上virtual的话,就不能动态绑定派生类的析构函数(当然析构函数的动态绑定你可以看出来跟一般函数的动态绑定相比是特殊的,析构函数的虚函数不用按照函数名来找对应的的函数)。
一句话:基类的析构函数加了virtual就可以动态绑定派生类的析构函数,这样的话,在执行多态后删除其对象,就可以在删除对象的时候执行派生类的析构函数了(当然执行基类的析构函数是一定会的)。否则不会执行派生类的析构函数。
代码输出结果:
this is Derived's function
this is Derived's destroy
this is Base's destroy
你可以尝试一下把基类的析构函数前的virtual删掉(第9行),输出结果将是:
this is Derived's function
this is Base's destroy
你可以观察到,没有执行派生类的析构函数