類虛析構函式 使用原因,使用時機

2021-06-16 21:14:39 字數 770 閱讀 2666

我們知道,用c++開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明:    

有下面的兩個類:

class clxbase 

virtual ~clxbase()

的輸出結果是:

do something in class clxderived! 

output from the destructor of class clxderived!

基類析構函式始終會被呼叫的

這個很簡單,非常好理解。 

但是,如果把類clxbase析構函式前的virtual去掉,那輸出結果就是下面的樣子了:

do something in class clxderived!、

基類析構函式始終會被呼叫的

也就是說,類clxderived的析構函式根本沒有被呼叫!一般情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話就會造成記憶體洩漏。我想所有的c++程式設計師都知道這樣的危險性。當然,如果在析構函式中做了其他工作的話,那你的所有努力也都是白費力氣。 

所以,文章開頭的那個問題的答案就是--這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫(當然基類析構函式也會接著被呼叫) 

當然,並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式。

而建構函式是不能寫成虛函式的,否則編譯錯誤。

使用虛析構函式的原因

我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public clxba...

C 析構函式的呼叫時機

結論 只有當類的某個例項化物件的建構函式執行完畢,而且當該物件退出作用域時,才會執行析構函式。如果在執行建構函式的過程中丟擲了異常,就不會呼叫析構函式 上測試 1 class test 210 test 1114 15 16int main 1722 catch 2326 return0 27 執行...

虛析構函式的使用

如果乙個類不會用作基類,就不需要使用任何虛函式,因為使用虛函式會增加程式的開銷。但是,如果要作為基類,為維護完整性,就需要使用虛函式,讓子類定義自己的具體行為。所以基本的一條是,無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。實際上,很多人這樣總結 當且僅當類裡包含至少乙個虛函式的時候才去宣告虛析構...