天天看點

2012年C++專家進階之三問題:為什麼構造函數不能是虛函數證明:假設構造函數是虛拟函數。

2012年C++專家進階之三

方法:反證法

如果派生類或者說子類,寫成和基類、父類一模一樣的函數,也就是函數說,名稱相同,而且參數也相同。

注意:基類是虛函數,是帶關鍵字virtual的。

滿足覆寫的條件:

1.分屬于不同類,子類與基類;

2.基類的函數帶virtual關鍵字;

3.函數名稱相同;

4.參數也相同;

根據構造函數實作,總是先構造基類對象,但是又根據《2012年C++專家進階之二》,子類的構造函數又将覆寫基類的構造函數,将造成無法構造基類對象,進而出錯。沖突!

  理論:虛函數是通過通路一張虛函數表(Virtual

Table,簡稱VTable)來實作的。VTable存儲的是對象執行個體的記憶體空間資訊,也就是各個虛函數的位址資訊。

既然構造函數是虛函數,那麼就需要通路VTable表,可是對象都還沒有執行個體化,記憶體空間都還沒有申請配置設定呢,記憶體空間都還沒有,又去哪兒找VTable表?沖突!

   也就是說VTable虛函數表是在構造函數調用之後,才生成的。

繼續閱讀