之前做過一個測試,在一個類中定義一個virtual修飾的函數時,sizeof這個類,發現類的大小多了恰好一個指針的字節大小,當初不明白,只是記住有這么一個特性。后來,發現它就是c++編譯器給我們添加的vptr指針。
當類中聲明虛函數時,編譯器會在類中生成一個虛函數表;
虛函數表是一個存儲成員函數指針的數據結構;
虛函數表是由編譯器自動生成與維護的;
virtual成員函數會被編譯器放入虛函數表中;
存在虛函數時,每個對象都有一個指向虛函數的指針(vptr指針)
在實現多態的過程中,父類和派生類都有vptr指針。
對象中的vptr指針什么時候被初始化:
對象在創建時,由編譯器對vptr指針進行初始化;
只有當對象的構造完全結束后vptr的指向才最終決定下來;
父類對象的vptr指向父類的虛函數表,子類對象的vptr指向子類的虛函數表。
定義子類對象時,vptr先指向父類的虛函數表,在父類構造完成之后,子類的vptr才指向自己的虛函數表。(這也就是在父類或者子類的構造函數中調用虛成員函數不會實現多態的原因,這是一道面試題)
