Virtual destruct(虛析構函式)

2022-03-24 13:46:47 字數 744 閱讀 5963

面試的時候,我答了虛函式是怎麼工作的,但是當面試官問我為什麼析構函式的基類一定需要virtual時候,我答的不是太好,所以來總結下

先說結論,當基類的指標指向子類的物件時,如果delete此指標,如果基類沒有virtual析構函式,那麼呼叫時只會呼叫基類的析構函式,而子類的空間未釋放。

如以下例子

從如上例子可以看出子類的析構函式未被呼叫,此時造成記憶體洩露。但是在基類加上virtual後,如下

成功釋放,這就是為何要在基類加上virtual防止記憶體洩露,保證安全釋放。

虛析構 純虛析構

析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...

虛析構和純虛析構

多型使用時,如果子類有屬性開闢到堆區,那麼父類指標在釋放時無法帶呼叫到子類的析構 解決方式 將父類的析構函式改為純虛析構或者虛析構 1.可以解決父類指標釋放子類物件 2.都必須要有具體的函式實現 虛析構和純虛析構的區別 如果是純虛析構,該類屬於抽象類,無法例項化物件 include include ...

4 7 5 虛析構和純虛析構

多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 virtual 類名 virtual 類名 0 include include include include using namespace std class a...