C 虛析構函式例項

2021-10-09 23:32:48 字數 1327 閱讀 9638

//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 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...