虛析構函式

2021-08-01 15:04:22 字數 1055 閱讀 5741

虛析構函式是為了解決這樣的乙個問題:基類的指標指向派生類物件,並用基類的指標刪除派生類物件。

如果某個類不包含虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,使析構函式為虛一般是個壞主意。因為它會為類增加乙個虛函式表,使得物件的體積翻倍,還有可能降低其可移植性。

所以基本的一條是:無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。實際上,很多人這樣總結:當且僅當類裡包含至少乙個虛函式的時候才去宣告虛析構函式。

抽象類是準備被用做基類的,基類必須要有乙個虛析構函式,純虛函式會產生抽象類,所以方法很簡單:在想要成為抽象類的類裡宣告乙個純虛析構函式(注:純虛析構函式也需要給出其函式體的,只是在申明的時候申明為純虛函式而已)。

當你的類準備給別人繼承時要提供虛析構函式,考慮下面例子:

#include

using

namespace std;

classa~

a()}

;classb:

public a~b

()private

:char

*m_p;};

intmain

(int argc,

char

* argv)

輸出結果:

in a constructor

in b constructor

in a destructor

並沒有呼叫b的析構函式,new出來的記憶體沒有及時**造成記憶體洩漏。要解決這個問題,只要將a的析構函式定義為虛函式:

virtual ~a()

為什麼定義為虛函式就能解決呢?

答:只有實現多型,即虛函式,這樣才能確保在發生函式重寫時,根據實際的物件型別呼叫具體的函式。此題目中雖然是父類呼叫了析構函式,但物件的實際型別確實子類(class b),故實現多型後首先呼叫的是子類的析構函式,再呼叫父類的析構函式。

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...