條款07 為多型基類宣告virtual析構函式

2021-08-10 18:56:23 字數 1554 閱讀 1217

總結:1.帶有多型性質的基類,應該將其析構函式宣告為virtual,如果class帶有任何虛函式,他就應該有乙個virtual的析構函式。

因為如果乙個基類的指標指向派生類的物件,而這個基類的析構函式不是虛函式的話,那麼在銷毀這個指標的時候,派生類對物件中的派生類成份沒有被銷毀,這樣會造成詭異的區域性銷毀,從而形成資源洩露。

首先來看**如下:

注意在這裡只呼叫了基類的析構函式,而派生類的析構函式沒有呼叫。(附加:基類指標指向派生類是可以的(會有隱式的型別轉換吧),但是如果沒有多型發生的話,通過基類指標只能訪問基類中的成員,因為他無妨訪問到派生類的成員,但是如果是派生類的指標指向基類的物件,這是不行的,因為無法把乙個基類轉換為派生類)

**.如果給基類的析構函式加上virtual這個時候就可以正常的釋放派生類部分了

只需要將上述基類中的析構函式宣告為虛析構函式,就可以了

為什麼宣告虛析構函式就可以了呢?因為如果不是虛函式的話,不會產生動態聯編(不知道動態聯編的可以去我部落格的多型中看)所以編譯器在呼叫析構函式的時候根據指標的型別進行析構函式呼叫了,但是如果宣告為虛函式的話,這個時候就會產生動態聯編,在呼叫析構函式的時候,編譯器根據所傳過來的物件,從而先呼叫派生類的析構函式,然後在呼叫基類的析構函式了。

2.如果class不含虛函式的話,通常表示他並不意圖做乙個基類(被繼承),所以當乙個類不作為基類的時候,令其析構函式為虛函式是個不好的做法,這樣會增加類物件的大小(多乙個vptr指標,指向vtbl函式指標陣列),注意宣告為虛析構函式的條件和情況,自己立理解一下。

3.不要隨便繼承沒有虛析構函式的類,因為這樣不經意間就會造成派生類物件未被釋放,造成資源洩露

4.如果你想使用抽象類作為基類,最好將抽象類的將抽象類的析構函式宣告為純虛析構函式,但是一定記得定義抽象類的析構函式。

class abstract

;abstract::~abstract()

因為在釋放物件的 時候在派生類的虛析構函式先被呼叫,然後再派生類的析構函式中建立基類的析構函式,即使是抽象類,編譯器也要呼叫他的析構函式,所以為了保證不在鏈結期間發生錯誤,最好給出抽象類析構函式的定義。

5.建構函式不能定義為虛函式!為什麼呢?

說一條我自己的理解吧,因為類中有虛函式,意味著就有vptr指標,然而vptr指標的初始化(使其指向虛表)需要建構函式來完成,這是矛盾的,相當於乙個死迴圈,所以建構函式函式不能是虛函式。具體還有其他的原因,可以查閱相關資料了解。

條款07 為多型基類宣告virtual析構函式

結論1 polymorphic 帶多型性質的 base classes 應宣告乙個virtual 析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式。c 指出當derived class物件經由乙個base class指標被刪除,而該base class帶有乙...

條款07 為多型基類宣告virtual析構函式

1 任何帶有虛函式的類都幾乎確定應該定義乙個虛析構函式。乙個經驗是 只有當類含有至少乙個virtual函式才會為它宣告virtual析構函式。2 如果乙個類不含有virtual函式,通常表示它並不意圖作為基類 當類不意圖作為基類,令其析構函式為virtual是個餿主意。因為有虛函式,該類就要有指向虛...

條款07 為多型基類宣告virtual析構函式

條款07 為多型基類宣告virtual析構函式 1.c 明確指出,當子類物件經由乙個基類指標刪除,而該基類帶著乙個non virtual析構函式,其結果未有定義。實際執行時通常發生的是物件的derived成分沒有被銷毀。也就是不光子類 裡面的成員變數可能沒被銷毀,而子類的析構函式也未能執行起來。而基...