//program 15.5.1.cpp
#include
< iostream >
#define to_version_new 1
/*根據需要是否將(基類)虛構函式編譯為虛析構函式(virtual版)*/
using
namespace std;
class
cshape;}
;class
crectangle
:public cshape};
intmain()
/*程式的輸出結果:
非虛析構函式版本的輸出
cshape::destrutor
*//*輸出的結果說明執行「delete p;" 只引發了cshape 類的析構函式被呼叫,沒有引發crectangle類的析構函式呼叫。
這是因為該語句是靜態聯編的,編譯器編譯到此時,不可能知道此時p到底指向那個型別的物件,
它只根據 p的型別 是cshape*,來決定應該呼叫cshape類的析構函式。
但按理說,「delete p;」導致乙個crectangle類的物件消亡,應該調
用crectangle類的析構函式才符合邏輯,否則有可能引發程式的bug。
例如,假設程式需要對cretangle物件進行計數,那麼此處不呼叫cretangle類的析構函式,就會導致計數不正確(如果借助析構函式來計數)。
再如,假設crectangle物件存續期間進行了動態記憶體分配,而釋放記憶體的操作都是在析構函式中進行的,那麼此處不呼叫cretangle類的析構函式,就會導致被delete的物件中的動態分配的記憶體以後再也沒有機會**。
綜上所述,希望「delete p;」這樣的語句,能夠聰明地根據p所指向的物件,來執行相應的析構函式。實際上,這也是多型。
為了在這種情況下實現多型,c++規定,需要將基類的析構函式宣告為虛函式,即虛析構函式。將上面的程式中的cshape類改寫,在析構函式前加「virtual"關鍵字,將其宣告為虛函式:
class cshape
};則程式的輸出結果變成:
crectangle:: destrutor
cshape :: destrutor
說明cretangle類的析構函式被呼叫了。
實際上,派生類的析構函式,會自動呼叫基類的析構函式(是自下而上的)。而且,
只要基類的析構函式是虛函式,那麼派生類的析構函式不論是否用「virtual"關鍵字宣告,都自動成為虛析構函式。(不同類的析構函式名顯然不同,其實這裡不需要同名同引數)
一般來說,乙個類如果定義了虛函式,
則最好將析構函式也定義成虛函式。(使得
*//*版本_2*/
C 例項之虛析構函式
一 父類的析構函式是虛函式時 include stdafx.h include using namespace std class clxbase virtual clxbase virtual void dosomething class clxderived public clxbase clx...
C 析構函式 虛析構函式
1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...