C++中虚析构函数的必要性
析构函数不能被声明为 const、volatile 或 static。但是,它可以被声明为 virtual。
析构函数在对象生命周期结束的时候会被调用,那么基类和子类的析构函数是如何被调用的呢?情况如下:
情况1:用派生类类型指针绑定派生类实例,析构的时候,不管基类析构函数是不是虚函数,都会正常析构
情况2:用基类类型指针绑定派生类实例,析构的时候,如果基类析构函数不是虚函数,则只会析构基类,不会析构派生类对象,从而造成内存泄漏。为什么会出现这种现象呢,个人认为析构的时候如果没有虚函数的动态绑定功能,就只根据指针的类型来进行的,而不是根据指针绑定的对象来进行,所以只是调用了基类的析构函数;如果基类的析构函数是虚函数,则析构的时候就要根据指针绑定的对象来调用对应的析构函数了。
#include <iostream>
using namespace std;
class Base
{
public :
Base()
{
cout << "Base count " << endl;
}
~Base()
{
cout << " Base descount" << endl;
}
};
class Child :public Base
{
public:
Child()
{
cout << "Child count" << endl;
}
~Child()
{
cout << "Child descout" << endl;
}
};
int main()
{
Base *p = new Child;
delete p;
return 0;
}
运行结果是:基类的析构函数被调用了,子类的析构函数没有被调用。
修改一下程序,将基类的析构函数设置为虚析构函数:
class Base
{
public :
Base()
{
cout << "Base count " << endl;
}
virtual ~Base()
{
cout << " Base descount" << endl;
}
};
运行结果是:子类的析构函数首先被调用了,随后,基类的析构函数也被调用了。
提示:一定要用到多态的时候,最好将基类的析构函数改为虚析构函数。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器