下面我們通過乙個例子了解一下。
#include
#include
using
namespace std;
// 父類
我們可以從執行結結果中看到,子類cat的析構函式沒有被呼叫,也就意味著我們在子類的建構函式中申請的一塊堆記憶體沒有被釋放。這樣是很不安全的。
解決方法:通過虛析構或者純虛析構(將父類的析構函式變為虛析構或者純虛析構)。
結論:如果子類中有指向堆區的屬性,那麼要利用虛析構技術,在delete的時候,呼叫子類的析構函式
virtual
~類名(
)
使用虛析構重新實現上面**
#include
#include
using
namespace std;
// 父類
class
animal
virtual
void
speak()
=0;// 虛析構
可以看到結果,已經呼叫了子類的析構
純虛析構需要有宣告,也需要有實現
如果乙個類中 有了純虛析構函式,那麼這個類也屬於抽象類,無法例項化物件。
// 類內宣告
virtual
~類名()=
0;// 類外實現
類名::
~類名(
)
使用純虛析構重新實現上面**
#include
#include
using
namespace std;
// 父類
class
animal
virtual
void
speak()
=0;// 純虛析構宣告
virtual
~animal()
=0;char
*m_name;};
// 純虛析構實現
可以看到結果,已經呼叫了子類的析構
虛析構和純虛析構
多型使用時,如果子類有屬性開闢到堆區,那麼父類指標在釋放時無法帶呼叫到子類的析構 解決方式 將父類的析構函式改為純虛析構或者虛析構 1.可以解決父類指標釋放子類物件 2.都必須要有具體的函式實現 虛析構和純虛析構的區別 如果是純虛析構,該類屬於抽象類,無法例項化物件 include include ...
虛析構 純虛析構
析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...
4 7 5 虛析構和純虛析構
多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 virtual 類名 virtual 類名 0 include include include include using namespace std class a...