zoukankan      html  css  js  c++  java
  • C++中虚析构的作用

    为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

    基本概念:

    析构函数是用来回收对象的;

    虚析构函数是析构函数的一种;

    基类是一类对象共有属性的抽象。比如,猫和狗都是动物,都会叫。但是猫是“喵喵喵”,狗是“汪汪汪”。虽然音色不一样,但是都叫这同一种行为。那么他们俩的基类只能说明这类对象会叫,具体怎么叫,由子类决定。子类不同的继承就会涉及不同的析构,所以析构函数也不能写死,于是就有了虚析构。

    举例:

    class ClxBase
    {
    public:
        ClxBase() {};
        virtual ~ClxBase() {};
    
        virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
    };
    
    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived() {};
        ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 
    
        void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
    };

    执行如下代码:

    1 ClxBase *pTest = new ClxDerived;
    2 pTest->DoSomething();
    3 delete pTest;

    结果如下:

    1 Do something in class ClxDerived!
    2 Output from the destructor of class ClxDerived!

    把类ClxBase析构函数的virtual去掉,输出如下:

    1 Do something in class ClxDerived!

    在这里类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。

    注意:

    并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

  • 相关阅读:
    【团队作业冲刺'十日谈'】第七天——端侧部署6、记录保存
    团队冲刺第六天端侧部署5,模型下载功能2
    团队冲刺第五天端侧部署4,模型下载
    冲刺第四天 端侧部署3,登陆页面2
    冲刺第三天 端侧部署2,登录功能
    冲刺第二天模型训练2+端侧部署
    每日总结4.27
    每日总结4.26
    Jenkins基于https的k8s配置
    快速搭建私有gitlab
  • 原文地址:https://www.cnblogs.com/wangboqi/p/7356155.html
Copyright © 2011-2022 走看看