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的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。

    注意:

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

  • 相关阅读:
    用折半查找法找出整型数组中指定元素所在的位置,并输出(折半查找法只能用于有序数列)。
    统计母字符串中含有子串的个数。
    //插入排序法对数组中的元素按从小到大进行排序
    求斐波那契(fibonacci)数列前20项的值 ,递归调用
    C++实现一句英文句子中的单词逆置
    C语言-黑白棋(人机对战)
    第九届蓝桥杯-明码
    四连块dfs
    八连块dfs
    求素数
  • 原文地址:https://www.cnblogs.com/wangboqi/p/7356155.html
Copyright © 2011-2022 走看看