多態中的虛函數表是在運行時創建的還是編譯時創建的?
答:虛函數表在編譯的時候就確定了,而類對象的虛函數指針vptr是在運行階段確定的,這是實現多態的關鍵
(類的函數的調用並不是在編譯時就確定的,而是在運行時才確定的,由於編寫代碼的時候並不能確定被調用的是基類的函數還是哪個派生類的函數,所以聲明為虛函數。虛函數和虛函數表是兩個不同的東西,虛函數的調用是在運行時才確定的,虛函數表是在編譯時就已經確定的了 。)
為什么構造函數不能聲明為虛函數?
1.創建一個對象必須明確指出它的類型,否則無法創建,一個對象創建成功編譯器獲得它的實際類型,然后去調用對應的函數,而如果構造函數聲明為虛函數,會形成一個死鎖,虛函數是在運行才能確定確定其調用哪一個類型的函數,而具體哪一個類型是編譯器通過對象的類型去確定的,但是此時對象還未創建也就沒法知道其真實類型。
2.虛函數對應一張虛函數表,這個虛函數表是存儲在對象的內存空間的,如果構造函數是虛函數就需要通過虛函數表來調用,可是對象還沒有實例化,也就是內存空間還沒有,找不到虛函數表,所以構造函數是不能聲明為虛函數的。