C 虛析構函式

2021-07-13 04:13:57 字數 1187 閱讀 5717

析構函式可以使虛函式,而建構函式不可以

從實現上看,vbtl在構造函式呼叫後才建立,因而建構函式不可能成為虛函式

從實際含義上看,在呼叫建構函式時還不能確定物件的真實型別(因為子類會調父類的建構函式);而且建構函式的作用是提供初始化,在物件生命期只執行一次,不是物件的動態行為,也沒有太大的必要成為虛函式

在c++程式開發時,用作基類的類的析構函式一般要定義為虛函式,為什麼要這樣做呢?先看乙個例子,**如下:

#include

using namespace std;

class clsbase  //定義基類

;

class clsderived:public clsbase//派生類

;

void main()

#include using namespace std; 

class clsbase //定義基類

執行結果:

可以看出,在新建派生類物件的時候,先構建基類物件,然後再構建派生類的物件。在刪除由基類指標指向的派生類物件時,先刪除派生類物件,然後再刪除基類物件。如果把基類中析構函式前的virtual關鍵字去掉,輸出結果如下:

結果說明,派生類clsderived的析構函式根本沒有被呼叫!(因為動態聯編,對於由基類指標指向的派生類物件,在執行時會檢查派生類物件有無過載析構函式,有則呼叫之,然後呼叫基類的析構函式,否則直接呼叫基類的析構函式)

一般情況下,類的析構函式都是用來釋放記憶體資源的,如果析構函式沒有被呼叫的話,會造成記憶體洩露,這是很危險的。

所以,在基類中把析構函式定義為虛函式的作用就是:當通過基類指標刪除乙個派生類的物件時,派生類的析構函式能夠被呼叫。

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

但是對於一般成員函式,如果基類中沒有定義為虛函式,即使在派生類中對其重寫,在呼叫時也只會呼叫基類中的函式。

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

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

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

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

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