1. 程式人生 > >C++物件模型之記憶體佈局(3)

C++物件模型之記憶體佈局(3)

轉載地址:https://mp.weixin.qq.com/s/dTyAC2IQ50c9nmQGOC0c2A

 

經過兩天的摸索,今天終於搞清楚C++物件模型.前兩篇C++物件模型之記憶體佈局(2)C++物件模型之記憶體佈局(1)(請戳我)已經講解了單繼承,多重繼承和多繼承的物件模型.今天講解菱形繼承,雖然過程艱難,但是收穫豐富.

 

簡單虛擬繼承物件

 

首先編寫如下的測試程式:

上述程式的輸出如下:

簡單解釋下:當存在虛基類時,先是子類的成員,然後才是虛基類的成員.

以下是C物件的物件模型:

通過在gdb下,輸入指令:

 

也可以輸出C物件的物件模型.截圖如下:

我在理解這個的時候,有分析過c物件呼叫虛基類的成員方法.通過反彙編程式碼,我發現當cp呼叫A中方法時,它先從C類的虛擬函式表首地址-24位元組處獲取A子物件相對於cp的偏移量16.所以C的虛擬函式表首地址負方向的空間還是有研究的地方。

當我把C物件的函式f1改成f時,即重寫A中的f方法,這時cp中A的子物件中f方法將被C的f方法替換,但是程式輸出有錯,原因不明。如下:

 

 

菱形繼承下的物件模型

 

編寫如下程式:

 

此時程式輸出仍然有錯,因為c重寫了A中的方法。原因不明。c物件模型為:

如果c不重寫A的f方法,即將A的f方法改為f0,則程式輸出如下:

我都實在ubuntu下,g++編譯器實現的。但是vs的編譯器實現是不同,關於vs平臺,大家可以看看陳皓的部落格,附上陳皓的部落格:http://blog.csdn.net/haoel/article/details/3081328/