virtual修飾符應用探索——-虛析構

來源:互聯網
上載者:User

有以下定義

class CA

{

public:

    CA(){}

    ~CA(){ cout << "destruction CA" << endl; }

};

 

class CB:public CA

{

public:

    CB(){}

    ~CB(){ cout << "destruction CB" << endl;}

};

 

class CC:public CB

{

public:

    CC(){}

     ~CC(){ cout << "destruction CC" << endl;}

};

考慮如下代碼

       CA *a = new CC();

       delete a;

讓我們看一下結果:destruction CA

哦!你可能看到了,只有CA的解構函式被調用,假如CB,CC的解構函式內有delete 操作,記憶體泄露看來是不可避免的。那麼假如CA的解構函式為虛函數又會怎麼樣呢?

class CA

{

public:

    CA(){}

    virtual ~CA(){ cout << "destruction CA" << endl; }

};

再看一下結果:

destruction CC

destruction CB

destruction CA

       每一個類的解構函式都被調用了。析構順序是這樣的:

       首先從CC開始析構,在完成CC解構函式的全部操作並結束析構之前調用CB解構函式,在完成CB解構函式的全部操作並結束析構之前調用CA解構函式,由於CA函數為最基本的類,CA解構函式在完成全部操作後就直接結束了,然後結束的是CB解構函式,最後結束的是CC解構函式。所以子類的解構函式已耗用時間要長與父類解構函式的已耗用時間。

       若CA的解構函式不是虛函數,CB或CC的解構函式卻為虛函數,結果會怎麼樣?答案是編譯器出錯,錯誤資訊是:BLOCK_TYPE_IS_VALID為什麼出錯呢?你知道嗎?我暫時還沒搞清楚J。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.