C++類有繼承時,析構函數必須為虛函數


C++類有繼承時,析構函數必須為虛函數。如果不是虛函數,則使用時可能存在內在泄漏的問題。

假設我們有這樣一種繼承關系:

如果我們以這種方式創建對象:

SubClass* pObj = new SubClass();
delete pObj;

不管析構函數是否是虛函數(即是否加virtual關鍵詞),delete時基類和子類都會被釋放;

如果我們以這種方式創建對象:

  • 若析構函數是虛函數(即加上virtual關鍵詞),delete時基類和子類都會被釋放;
  • 若析構函數不是虛函數(即不加virtual關鍵詞),delete時只釋放基類,不釋放子類;
  • 測試代碼

    大家可以自己測試一下,以下是我的測試代碼:

    #include <string>
    #include <iostream>
    
    class BaseClass
    {
    public:
        BaseClass()
            : m_pValue(NULL)
        {
        }
    
        /*virtual */~BaseClass()
        {
            delete m_pValue;
            m_pValue = NULL;
            std::cout << "BaseClass virtual construct." << std::endl;
        }
    
        void SetValue(int v)
        {
            if (!m_pValue)
            {
                m_pValue = new int(v);
            }
            else
            {
                *m_pValue = v;
            }
        }
    
    private:
        int* m_pValue;
    };
    
    class SubClass : public BaseClass
    {
    public:
        SubClass()
            : BaseClass()
            , m_pstrName(NULL)
        {
        }
    
        /*virtual */~SubClass()
        {
            delete m_pstrName;
            m_pstrName = NULL;
            std::cout << "SubClass virtual construct." << std::endl;
        }
    
        void SetName(const std::string& name)
        {
            if (!m_pstrName)
            {
                m_pstrName = new std::string(name);
            }
            else
            {
                *m_pstrName = std::string(name);
            }
        }
    
    private:
        std::string* m_pstrName;
    };
    
    
    int main()
    {
        BaseClass* pObj = new SubClass();
        pObj->SetValue(10);
        ((SubClass*)pObj)->SetName("zhangsan");
        delete pObj;
        pObj = NULL;
        return 0;
    }

    原文地址:https://blog.csdn.net/luoweifu/article/details/53780438


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM