最近準備複習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。
父類為a,子類為b,**如下:
1classa2
8 ~a()912
}13class b:publica14
20 ~b()
2124
25 }
這個時候在main函式裡,
定義乙個a的物件,a a;執行輸出結果為:構造a 析構a。
定義乙個b的物件, b b;執行的輸出結果為:構造b 析構b。
定義乙個a的指標,指向b。a *p = new b; 執行輸出結果為:構造a 構造b.這個時候很多人就容易出問題了,為啥沒呼叫析構呢,這個也是經常遇到的問題,最簡單也是最容易遺忘的。new出來的物件沒有刪,還有寫一行** delete p;這個時候的執行輸出結果為:構造a 構造b 析構a。又出現問題了,b的析構怎麼沒走,這個時候需要一用虛析構這個概念,虛析構的功能:父類的析構寫成虛析構,在刪除父類的指標的時候,可以刪除子類的物件,避免記憶體洩漏。
具體操作就是把上面**的第八行,前面加乙個virtual。這個時候再執行輸出結果為:構造a 構造b 析構b 析構a。注意這裡也可以看出呼叫順序,先走父類的構造,然後子類的構造。先走子類的析構,最後走父類的析構。
虛析構和純虛析構 C
解決父類無法釋放子類的堆區記憶體問題。注意 純虛析構無法例項化 虛析構和純虛析構 多型使用時,如果子類有物件開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 虛析構和純虛析構的共性 可以解決父類指標釋放子類物件 都需要有具體的函式實現虛析構和純...
虛析構 純虛析構
析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...