這裏唯一想說明的一點就是,使用虛函數繼承時,當繼承類被強轉成基類後調用虛函數,調用的還是繼承類的虛函數。而重載方式的繼承類被強轉成基類再調用重載函數,則調用的是基類的函數。廢話不多說,上代碼:
這段代碼執行的輸出是:
A::fun
AP:fun
B:fun
B:fun
通過彙編分析主要的代碼片段如下:
其中fun_GetAPFuns函數,就是獲取AP實例被強轉後的函數表地址,函數定義如下:
不難看出,針對((A*)&ap)->fun(); 這行代碼調用,實際上是先獲取了基類的函數表,然後又被繼承類的函數表覆蓋了。因此輸出結果纔會是AP:fun。
而對於直接重載繼承的經過強轉調用,在編譯時就直接替換成基類的函數調用了。