虛析構函式是為了解決這樣的乙個問題:基類的指標指向派生類物件,並用基類的指標刪除派生類物件。
如果某個類不包含虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,使析構函式為虛一般是個壞主意。因為它會為類增加乙個虛函式表,使得物件的體積翻倍,還有可能降低其可移植性。
所以基本的一條是:無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。實際上,很多人這樣總結:當且僅當類裡包含至少乙個虛函式的時候才去宣告虛析構函式。
抽象類是準備被用做基類的,基類必須要有乙個虛析構函式,純虛函式會產生抽象類,所以方法很簡單:在想要成為抽象類的類裡宣告乙個純虛析構函式(注:純虛析構函式也需要給出其函式體的,只是在申明的時候申明為純虛函式而已)。
當你的類準備給別人繼承時要提供虛析構函式,考慮下面例子:
#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 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...