多重繼承與型別轉換 -- 虛基類多繼承
阿新 • • 發佈:2019-01-31
多重繼承是C++的特性之一,但在比較新的Java和C#中被摒棄,因為多重繼承在型別轉換中會出現一些有意思的現象。
下面是虛方法多重繼承
在程式中加入斷點,除錯執行,發現pIA的值為0x003a53f8,
而pIB的值為0x003a53fc,也就是說pIB比pIA向後偏移了4個位元組
派生類物件指標轉換為不同基類物件指標時,編譯器會做一些小小的手腳
按照派生類宣告的繼承順序,轉換為第一基類時指標不變,以後依次向後偏移前一基類所佔位元組數
這裡第一基類IA沒有資料成員,偏移量是虛表指標的大小-4位元組,
如果有資料成員,還要加上資料成員的大小
注:基於資料對齊原則,在32位系統不足4位元組算做4位元組
為什麼會這樣呢?
對於虛方法物件來說,物件開始位置是虛表指標,如果多繼承的話
每一個基類都有各自的虛表指標和資料成員,這樣派生類物件如何構造呢?
派生類的記憶體結構如下:
基類A虛表指標 基類A資料成員 基類B虛表指標 基類B資料成員 。。。。。。 派生類資料成員
這樣,派生類物件指標在向上轉型時,要正確的獲取基類的虛方法和資料成員,
只有將指標改變。
======================================
以上有些是自己的經驗,如有錯誤,請指出
最近積勞成疾,得痔瘡了 -_-~!!! 要回去休息了
至於非虛基類,還要再試驗試驗,明天再寫