c++類裡面,我們經常可以看到析構函式是虛函式,這個虛函式有什麼作用嗎?我們可以通過乙個很簡單的例子來看看虛析構函式的作用。
#includeusingnamespace
std;
class
cbase
};class cchild: public
cbase
};intmain()
~
輸出:
cchild::~cchild()cbase::~cbase()
cbase::~cbase()
使用虛擬析構函式:
includeusingnamespace
std;
class
cbase
};class cchild: public
cbase
};intmain()
輸出:
includeusingnamespace
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 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...