虛析構 純虛析構

2022-05-27 08:45:14 字數 1106 閱讀 3262

析構函式的工作方式是:最底層的派生類(most derived class)的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。--從高到低依次析構…

因為在c++中,當乙個派生類物件通過使用乙個基類指標進行刪除(b::a;  a *a = new b();  delete a),而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然而,基類部分很可能已被銷毀,這就導致了乙個古怪的「部分析構」物件,這是乙個洩漏資源。排除這個問題非常簡單:給基類乙個虛析構函式。於是,刪除乙個派生類物件的時候就有了你所期望的正確行為。將銷毀整個物件,包括全部的派生類部分。

但是,一般如果不做基類的類的析構函式一般不宣告為虛函式,因為虛函式的實現要求物件攜帶額外的資訊,這些資訊用於在執行時確定該物件應該呼叫哪乙個虛函式。典型情況下,這一資訊具有一種被稱為 vptr(virtual table pointer,虛函式表指標)的指標的形式。vptr 指向乙個被稱為 vtbl(virtual table,虛函式表)的函式指標陣列,每乙個包含虛函式的類都關聯到 vtbl。當乙個物件呼叫了虛函式,實際的被呼叫函式通過下面的步驟確定:找到物件的 vptr 指向的 vtbl,然後在 vtbl 中尋找合適的函式指標。這樣子會使類所占用的記憶體增加。

例如:class a

{ public:

~a()                // 非虛析構

{ cout < <"a::~a" < class b:public a

{ public:

virtual ~b()    // 虛析構

{ cout < <"b::~b" < class c:public b

{ public:

~c()

{ cout < <"c::~c" < 所以:

1. 如果乙個類要被另外乙個類繼承,而且用其指標指向其子類物件時,那麼父類的析構必須是虛的,否則在delete該物件指標時,子類的析構函式將不會被呼叫。

2. 另外要記住,在構造乙個類的物件時,先構造其基類子物件,即呼叫其基類的建構函式,然後呼叫本類的建構函式,這和析構是相反的。

3. 只要最底層基類的析構是虛的,那麼子類的析構無論是否顯視的寫成虛或不虛,其實都是虛的。

虛析構和純虛析構

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

4 7 5 虛析構和純虛析構

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

12 7 6 虛析構和純虛析構

多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 這樣子類中的堆區資源無法釋放。解決方式 將父類中的析構函式改為虛析構或者純虛析構 虛析構和純虛析構共性 虛析構和純虛析構區別 我們來看之前的乙個案例 class animal animal class cat publ...