C 析構函式必須要用virtual修飾的原因

2021-07-25 23:05:39 字數 557 閱讀 8274

先舉例:

#include

using namespace std;

class father

~father()

~child(){cout<

int main(int argc, char** argv)

{father* pobj1 = new child();

delete pobj1;

cout<<"--"《執行結果:1--

21如果不用virtual函式,是沒有執行期繫結一說的,比如pobj1這個指標,其實它是child物件,但是在釋放時,~child()方法並沒有被呼叫,僅呼叫了~father方法。為什麼呢?因為沒有用virtual,就是編譯期繫結,當你在編譯時gcc/g++只知道pobj1是個father物件,所以在delete時就去呼叫father的析構了。

而如果定義成virtual ~father時,結果就是一定會析構child,這就是為什麼析構函式都要用virtual,因為沒人知道會不會有子類繼承,否則一旦繼承,發生這樣的事,析構函式裡萬一釋放了些資源,比如socket,比如memory,那就是資源洩露了。

為什麼要用虛析構函式

1 問題引出 為什麼要使用虛析構函式?class a 父親 int main 我們知道在delete p 中 delete 操作符,會呼叫物件的析構函式,但是這裡傳入的是父類物件指標,所以delete 此時並不知道應該呼叫哪個析構函式,保險起見則只呼叫父類的析構函式,也就是說如果沒有使用虛析構函式,...

C 析構函式 虛析構函式

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

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...