1. 程式人生 > >多重繼承與型別轉換 -- 虛基類多繼承

多重繼承與型別轉換 -- 虛基類多繼承

多重繼承是C++的特性之一,但在比較新的Java和C#中被摒棄,因為多重繼承在型別轉換中會出現一些有意思的現象。

下面是虛方法多重繼承

在程式中加入斷點,除錯執行,發現pIA的值為0x003a53f8,

而pIB的值為0x003a53fc,也就是說pIB比pIA向後偏移了4個位元組

派生類物件指標轉換為不同基類物件指標時,編譯器會做一些小小的手腳

按照派生類宣告的繼承順序,轉換為第一基類時指標不變,以後依次向後偏移前一基類所佔位元組數

這裡第一基類IA沒有資料成員,偏移量是虛表指標的大小-4位元組,

如果有資料成員,還要加上資料成員的大小

注:基於資料對齊原則,在32位系統不足4位元組算做4位元組

為什麼會這樣呢?

對於虛方法物件來說,物件開始位置是虛表指標,如果多繼承的話

每一個基類都有各自的虛表指標和資料成員,這樣派生類物件如何構造呢?

派生類的記憶體結構如下:

基類A虛表指標 基類A資料成員 基類B虛表指標 基類B資料成員 。。。。。。 派生類資料成員
這樣,派生類物件指標在向上轉型時,要正確的獲取基類的虛方法和資料成員,

只有將指標改變。

======================================

以上有些是自己的經驗,如有錯誤,請指出

最近積勞成疾,得痔瘡了 -_-~!!!  要回去休息了

至於非虛基類,還要再試驗試驗,明天再寫