C++中虚析构函数的必要性

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++服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值