C 類有繼承時,析構函式必須為虛函式

2021-10-04 03:20:17 字數 667 閱讀 3468

虛函式與多型一文中講了虛函式的用法和要點,但少講了一點,就是虛函式在析構中的用法,本文就是修復一bug的。

c++類有繼承時,析構函式必須為虛函式。如果不是虛函式,則使用時可能存在內在洩漏的問題。

假設我們有這樣一種繼承關係:

如果我們以這種方式建立物件:

subclass* pobj = new subclass();

delete pobj;

如果我們以這種方式建立物件:

baseclass* pobj = new subclass();

delete pobj;

#include

#include

class baseclass

/*virtual */~baseclass()

void setvalue(int v)

else

}private:

int* m_pvalue;

};class subclass : public baseclass

/*virtual */~subclass()

void setname(const std::string& name)

else

}private:

std::string* m_pstrname;

};int main()

建構函式不能是虛函式 基類析構函式必須為虛函式

1,從儲存空間角度 虛函式對應乙個虛表vtbl,可是這個vtbl其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtbl來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtbl。所以建構函式不能是虛函式。vtbl是在編譯期就建立了,各個虛函式這時被組織成了乙...

effective 為多型基類宣告虛析構函式

條款07這裡需要補充的知識點 我覺得很重要 因為虛函式的作用是為了動態聯編 實現多型 而為了實現動態聯編,物件需要額外多出vptr指標,會增加體積 sizeof可以明顯看出 vptr指向乙個由函式指標構成的陣列,稱為vtbl 虛表 每乙個帶有虛函式的類都有乙個相應的vtbl,實際被呼叫的函式取決於該...

C 中析構函式為虛函式

1 析構函式定義為虛函式時 基類指標可以指向派生類的物件 多型性 如果刪除該指標delete p 就會呼叫該指標指向的派生類析構函式,而派生類的析構函式又自動呼叫基類的析構函式,這樣整個派生類的物件完全被釋放。2 析構函式不定義為虛函式時 編譯器實施靜態繫結,在刪除基類指標時,只會呼叫基類的析構函式...