構造 析構函式與虛函式的聯絡

2021-10-08 18:22:12 字數 1238 閱讀 3561

目錄

一、構造/析構函式能不能作為虛函式

1、建構函式不能作為虛函式

2、析構函式可以作為虛函式(建議用virtual修飾父類析構函式)

二、構造/析構函式能不能發生多型

虛函式表指標正確的初始化是發生在建構函式執行結束之後,所以建構函式是不能作為虛函式的,假設你不小心用virtual去修飾建構函式,編譯器會直接報錯。

虛函式表指標初始化呼叫是在建構函式之後,析構之前,理論上是可以作為虛函式的,那麼析構函式函式作為虛函式的作用在哪呢?先看以下的一段**,乙個很簡單的多型實現:

可以很容易就看到,前兩行結果是由於繼承的關係,先執行父類的構造再執行子類的構造,但是析構並非是我們想要的結果,正確的結果應該是先進行子類的析構,再執行父類的析構,出現這種結果就是因為我們沒有將父類base的析構函式用virtual進行修飾,這樣編譯器就直接認為執行父類析構就完事了,並沒有對ret指標所指向的實際物件進行析構,所以需要用virtual對父類的析構函式進行修飾。

1、建構函式不能發生多型行為:建構函式執行時,虛函式表指標並未初始化;

2、析構函式也不能發生多型行為:析構函式執行前,虛函式表指標已被銷毀掉。

總結:當建構函式和析構函式呼叫虛函式時,只會體現當前類中的虛函式實現內容;

class base

virtual ~base()

virtual void func()

};class child : public base

~child()

virtual void func()

};int main(int argc, char *ar**)

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

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

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

虛函式是多型的基礎 ps多型是乙個介面多個實現 多型條件 1.繼承 2.虛函式 3.父類指標指向子類 include using namespace std class myclass virtual void go1 virtual void go2 class classx public myc...

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

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