C++中虛函數和非虛函數重載在繼承時的區別

      這裏唯一想說明的一點就是,使用虛函數繼承時,當繼承類被強轉成基類後調用虛函數,調用的還是繼承類的虛函數。而重載方式的繼承類被強轉成基類再調用重載函數,則調用的是基類的函數。廢話不多說,上代碼:

 

這段代碼執行的輸出是:

A::fun
AP:fun
B:fun
B:fun

 

通過彙編分析主要的代碼片段如下:

 
其中fun_GetAPFuns函數,就是獲取AP實例被強轉後的函數表地址,函數定義如下:

 

不難看出,針對((A*)&ap)->fun(); 這行代碼調用,實際上是先獲取了基類的函數表,然後又被繼承類的函數表覆蓋了。因此輸出結果纔會是AP:fun。

而對於直接重載繼承的經過強轉調用,在編譯時就直接替換成基類的函數調用了。

 

 

 

 

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