虛建構函式和虛析構函式

2021-08-18 22:15:56 字數 631 閱讀 2011

建構函式不能是虛成員函式,但析構函式可以是虛成員函式。

class a{

public:

a();

~a();

class b:public a{

public:

b();

~b();

int main(){

a* ptr;

ptr=new b();

delete ptr;

上述new操作會使建構函式a(),b()均被呼叫,因為ptr是指向b的物件的指標,因此基類和派生類的建構函式都會被呼叫,但是析構函式只會呼叫a的,因為當我們通過ptr進行delete操作時,儘管ptr實際指向乙個b的物件,但是它的資料型別是a*,析構函式不是虛成員函式,所以編譯器實施的是靜態繫結,編譯器會根據資料型別來決定呼叫哪乙個析構函式。這樣每執行一次new,只執行乙個delete,會有空間沒能夠釋放。

但是通過將基類中的析構函式宣告為虛函式,就可以進行執行期繫結,執行兩次析構函式,派生類的和基類的。

通常來說,如果基類有乙個指向動態分配記憶體的資料成員,並定義了負責釋放這塊記憶體的析構函式,就應該將這個析構函式宣告為虛成員函式,這樣做可以保證在以後新增該類的派生類時發揮多型性的作用。

虛建構函式和虛析構函式

1.析構函式可以為虛函式,且基類的析構函式一般均為虛函式。原因在於 通過基類指標delete base 時,可以通過虛的析構函式來釋放掉派生類獨自占用的記憶體,避免資源洩露。2.建構函式不可為虛函式。原因在於 建構函式是在物件完全構造之前執行的,在建構函式執行的時候,物件的動態型別還不完整。構造乙個...

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...