C 虛析構函式

2021-09-08 10:52:40 字數 1279 閱讀 2723

c++類裡面,我們經常可以看到析構函式是虛函式,這個虛函式有什麼作用嗎?我們可以通過乙個很簡單的例子來看看虛析構函式的作用。

#includeusing

namespace

std;

class

cbase

};class cchild: public

cbase

};intmain()

~

輸出:

cchild::~cchild()

cbase::~cbase()

cbase::~cbase()

使用虛擬析構函式:

includeusing

namespace

std;

class

cbase

};class cchild: public

cbase

};intmain()

輸出:

includeusing

namespace

std;

class

cbase

};class cchild: public

cbase

};intmain()

總結:delete p的時候呼叫基類還是子類的析構函式呢?其實這個問題很簡單,p是cchild指標(子類),那麼自然呼叫子類的析構函式了。基類析構函式會被呼叫嗎?答案是肯定的,其實這個是c++的特性,子類的析構函式會自動呼叫基類的析構函式。子類析構是這樣的過程:

1. 析構子類擴充套件部分(也就是執行子類析構函式**);

2. 在子類析構函式返回之前呼叫基類析構函式來釋放基類部分。

這個過程跟析構函式是否是虛函式無關。也就是說:

無論析構函式是否是虛函式,子類的析構函式一定會呼叫基類的析構函式。順序是先析構子類部分,再析構基類部分。

(對於建構函式,我們可以在子類的建構函式裡面選擇呼叫基類的某乙個建構函式,如果不在子類裡面顯式地呼叫基類建構函式,那麼系統自動會呼叫基類的預設建構函式。順序剛好和析構相反,先構造基類部分,再構造子類部分)

對於delete乙個指向子類的基類指標(p2):

1. 對於虛析構函式,那麼就是基類和子類的析構函式都會被呼叫,先析構子類部分,再析構基類部分。(基類析構函式是被子類析構函式自動呼叫的)

2. 對於非虛析構函式,子類析構函式不會被呼叫,只有基類析構函式才會被呼叫。

C 析構函式 虛析構函式

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

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

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

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

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