使用虛析構函式的原因

2021-08-17 04:35:01 字數 1020 閱讀 2224

**:

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

有下面的兩個類:

class

clxbase

;virtual

~clxbase() {};

virtual

void

dosomething() ;

};class

clxderived : 

public

clxbase;~

clxderived() ; 

void

dosomething() ;

};**

clxbase 

*ptest 

=new

clxderived;

ptest

->

dosomething();

delete ptest;

的輸出結果是:

do something in class clxderived!

output from the destructor of class clxderived!

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

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

do something in class clxderived!

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

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

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

析構函式定義為虛函式原因

注 本文內容 於zhice163博文,感謝作者的整理。1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase ...

析構函式定義為虛函式原因

先看下面一段程式 include using namespace std class person class student public person int main 執行結果 person person student student person person student studen...

析構函式定義為虛函式原因

先看下面一段程式 include using namespace std class person class student public person int main 執行結果 person person student student person person student studen...