建構函式 析構函式 虛函式

2021-10-03 14:57:03 字數 1486 閱讀 2172

在類中,建構函式用於初始化物件及相關操作。

建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table(虛函式表),這個表的位址是儲存在物件的記憶體空間的。

而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。

析構函式則用於銷毀物件完成時相應的資源釋放工作。

(當乙個類是基類的時候,才會把析構函式寫成虛函式。)

當基類的析構函式不為虛的話,其子類中所有的成員變數的類中分配的記憶體可能將洩漏。

將基類的析構函式設為virtual型,則所有的基類的派生類物件的析構函式都會自動設定為virtual型,這保證了任何情況下,不會出現由於析構函式沒有被呼叫而導致的記憶體洩漏。

具體解釋如下:

class base 

class derived: public base

base *ptr = new derived();

delete ptr;

這段**的執行結果是:

base constructor!

derived constructor!

base destructor!

在主函式中建立了乙個基類型別的指標,指標指向乙個派生類物件。

可以看出,最後的執行結果:程式並未呼叫派生類的析構函式,不呼叫派生類的析構函式則會導致b指標所指向的1000整型儲存空間不會被釋放,如此一來造成了記憶體洩漏

為了解決這個問題,可以將基類的析構函式宣告為虛函式,修改後程式執行結果為:

base constructor!

derived constructor!

derived destructor!

base destructor!

當基類的析構函式宣告為虛函式後,派生類的析構函式也自動成為虛析構函式。

在主函式中基類指標p指向的是派生類物件,當delete釋放p指標所指向的儲存空間時,會執行派生類的析構函式,派生類的析構函式執行完後會緊接著執行基類的析構函式,以釋放從基類基礎過來的成員變數所消耗的資源。

問題繼續來臨:

建構函式不能是虛函式

析構函式應該是虛函式

如果基類析構不加virtual關鍵字,那麼派生類物件在釋放時,只會呼叫基類析構。

加上virtual後,會先呼叫派生類析構,再呼叫基類析構。

這意味著,即使基類不需要顯示析構提供服務,也應該提供虛析構函式,即使它不執行任何任務。

友元函式不能是虛函式,因為友元不是類成員

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

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

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

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

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

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