【C++】構造函數、析構函數可以是虛函數麼?

構造函數不能是虛函數

1、創建一個對象必須明確指出它的類型,否則無法創建,一個對象創建成功,編譯器獲得它的實際類型,然後去調用對應的函數,而如果構造函數聲明爲虛函數,會形成一個死鎖,虛函數是在運行才能確定確定其調用哪一個類型的函數,而具體哪一個類型是編譯器通過對象的類型去確定的,但是此時對象還未創建也就沒法知道其真實類型。

2、虛函數對應一張虛函數表,這個虛函數表是存儲在對象的內存空間的,如果構造函數是虛函數就需要通過虛函數表來調用,可是對象還沒有實例化,也就是內存空間還沒有,找不到虛函數表,所以構造函數是不能聲明爲虛函數的。

析構函數可以是虛函數

若不將基類的析構函數聲明爲virtual,通過基類指針刪除派生類對象時,通常情況下只會調用基類的析構函數。但是,刪除一個派生類的對象時,應該先調用派生類的析構函數,然後調用基類的析構函數。

因此,一般來說,一個類如果定義了虛函數,則應該將析構函數也定義成虛函數;或者說,一個類打算作爲基類使用,也應該將析構函數定義成虛函數。這樣在通過基類指針刪除派生類對象時,會首先調用派生類的析構函數,然後調用基類的析構函數。

 

注:若在構造函數和析構函數中調用虛函數,不是多態。因爲編譯時即可確定,調用的函數是自己的類或基類中定義的函數,不會等到運行時才決定調用自己的還是派生類的函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章