c 從入門到精通 普通析構 虛析構 純虛析構

2021-10-06 18:35:15 字數 1399 閱讀 5319

#include

#include

using

namespace std;

class

animal

//普通析構 是不會呼叫子類的析構的,所以可能會導致釋放不乾淨

~animal()

};class

cat:

public animal

virtual

void

speak()

~cat()

}char

* m_name;};

void

test01()

intmain()

執行

小貓在說話

animal的析構呼叫

可以看到,cat物件的析構沒有呼叫。

在普通析構的基礎上新增virtual關鍵字

//普通析構 是不會呼叫子類的析構的,所以可能會導致釋放不乾淨

//利用虛析構來解決這個問題

virtual

~animal()

執行

小貓在說話

cat的析構呼叫

animal的析構呼叫

通過父類指標指向子類物件釋放時候不乾淨導致的問題。

純虛析構 ,需要宣告 還需要實現 類內宣告,類外實現。

#define _crt_secure_no_warnings

#include

#include

using

namespace std;

class

animal

//純虛析構 寫法如下

//純虛析構 ,需要宣告 還需要實現 類內宣告,類外實現

virtual

~animal()

=0;}

;//純虛析構函式實現

animal::

~animal()

class

cat:

public animal

virtual

void

speak()

~cat()

}char

* m_name;};

void

test01()

intmain()

執行

小貓在說話

cat的析構呼叫

animal的純虛析構呼叫

可以看到,釋放乾淨了。

寫法virtual 類名()=0;

類內宣告 類外實現

如果出現了純虛析構函式,這個類也算抽象類,不可以例項化

虛析構 純虛析構

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

虛析構和純虛析構 C

解決父類無法釋放子類的堆區記憶體問題。注意 純虛析構無法例項化 虛析構和純虛析構 多型使用時,如果子類有物件開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 虛析構和純虛析構的共性 可以解決父類指標釋放子類物件 都需要有具體的函式實現虛析構和純...

虛析構和純虛析構

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