什麼情況下,類的解構函式應該聲明為虛函數?

來源:互聯網
上載者:User
解構函式的用法
1.每個解構函式(不加 virtual) 只負責清除自己的成員。2.可能有基類指標,指向的確是衍生類別成員的情況。

對於第二種情況:

正確執行:基類指標可以指向衍生類別的對象(多態性),如果刪除該指標delete []p;就會調用該指標指向的衍生類別解構函式,而衍生類別的解構函式又自動調用基類的解構函式,這樣整個衍生類別的對象完全被釋放。
如果解構函式不被聲明成虛函數,則編譯器實施靜態繫結,在刪除基類指標時,只會調用基類的解構函式而不調用衍生類別解構函式,這樣就會造成衍生類別對象析構不完全。所以,將解構函式聲明為虛函數是十分必要的。
所以要保證運行適當的解構函式,基類中的解構函式必須為虛析構。反正你在寫一個類時,將其解構函式寫為虛函數總不會錯,一樣重載的。
樣本:
假設父類為A,子類為B,當A*   p   =   new   B();
要析構p指向的對象時,若a中的解構函式不是virtual,則調用delete p時,不會調用b的解構函式,這樣在b中分配的資源就無法釋放了。
會造成記憶體泄露 
class   A 

public: 
        virtual   ~A(   void   ); 
}; 

class   B   :   public   A 

public: 
        virtual   ~B(   void   ); 
        int   n; 
}; 

如果你這樣用: 

A   *pb   =   new   B; 
然後 
delete   pb; 
如果A的析構不是虛的,那麼刪除A的指標pb時,調用的解構函式就只有A的析構,但如果A的析構是虛的話,刪除pb時,就會從pb裡的虛函數表裡去尋找pb真實類型的解構函式。 

如果解構函式不是虛的,那麼刪除pb時,只調用了A的析構,而沒有調用B類的析構,所以B類中的int   n將不會被刪除,造成記憶體泄露!

註:

1. 一個成員函數被聲明為虛函數後,在同一類族中的類就不能再定義一個非virtual的但與該虛函數具有相同的參數(包括個數和類型)和函數傳回值類型的同名函數。

2. 根據什麼考慮是否把一個成員函式宣告為虛函數?

(1)成員函數所在的類是否會作為基類。

(2)成員函數在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它聲明為虛函數。

如果成員函數在類被繼承後功能不需修改,或衍生類別用不到該函數,則不要把它聲明為虛函數。

不要僅僅考慮到作為基類而把類中的所有成員函數都聲明為虛函數。

(3)調用是通過對象名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當聲明為虛函數。

說明:使用虛函數,系統要有一定的空間開銷。當一個類帶有虛函數時,編譯系統會為該類構造一個虛函數表,它是一個指標數組,存放每個虛函數的入口地址。系統在進行動態關聯的時間開銷很少,提高了多態性的效率。

 3. 解構函式的作用是在對象撤銷之前把類的對象從記憶體中撤銷。通常系統只會執行基類的解構函式,不執行衍生類別的解構函式。

  只需要把基類的解構函式聲明為虛函數,即虛解構函式,這樣就會撤銷基類對象的同時撤銷衍生類別的對象了,這個過程是動態關聯完成的。

4.如果將基類的解構函式聲明為虛函數時,由該基類所派生的所有衍生類別的解構函式都自動成為虛函數,即使衍生類別的解構函式與基類的解構函式名字不相同。

最好把基類的解構函式聲明為虛函數。這將使所有衍生類別的解構函式自動成為虛函數,如果程式中顯式delete運算子刪除一個對象,而操作對象用了指向衍生類別對象的基類指標,系統會調用相應類的解構函式。

5.建構函式不能聲明為虛函數。

6.純虛函數

有時候,基類中的虛函數是為了衍生類別中的使用而聲明定義的,其在基類中沒有任何意義。此類函數我們叫做純虛函數,不需要寫成空函數的形式,只需要聲明成:

    virtual float area()const=0;

一般形式:virtual 函數類型 函數名(形參表列)=0;

注意:純虛函數沒有函數體;

最後面的“=0“並不代表函數傳回值為0,只是形式上的作用,告訴編譯系統”這是純虛函數”;

這是一個聲明語句,最後應有分號。

純虛函數只有函數的名字但不具備函數的功能,不能被調用。在衍生類別中對此函數提供定義後,才能具備函數的功能,可以被調用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.