現在來介紹一下我的環境:
1.系統:ubuntu 12.04.2 lts
2.編譯器:gcc version 4.4.7 (ubuntu/linaro 4.4.7-1ubuntu2)
3.偵錯程式:gnu gdb (ubuntu/linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
後面的的文章也都是在這個環境的基礎上測試的。後續的驗證過程中會用的at彙編,所以大家可以熟悉一下at彙編的語法。
一、單繼承
現在步入正題,我們來分析一下c++單繼承的記憶體分布。這種情況是最簡單的,我們要**的是子類物件中包含的父類物件的資料到底是怎麼分布的。這裡我會一步步除錯檢視的。先附上乙個繼承關係圖,放眼看去,真的是太簡單了吧!!!
圖1.類繼承關係
源**:
#includeusing namespace std;
class father
};class son :public father
;int main()
};class son :public father,public uncle{}
main函式中修改:
cout
這樣編譯之後列印結果:
&er :0x1387030
er.c:0x1387030
er.a:0x1387034
er.get_cc:0x1387038
er.aa:0x138703c
er.d:0x1387040
er.e:0x1387044
sizeof(father):8
sizeof( -son-):24
上面我們驚奇的發現,子類er物件的大小變成了24個位元組,這是由於物件內容多了uncle類的資料域。子類繼承father和uncle類,所以可以看出子類物件資料的分布和宣告的繼承順序有關,越靠近子類越在上面(
class son :public father,public uncle)。記憶體如下表所示:
圖4.多繼承記憶體分布圖
C 記憶體分布之菱形繼承 無虛函式
一 繼承關係圖 圖1.菱形類圖 二 源 includeusing namespace std class ancestor int get c void class father virtual public ancestor int fa get anc c void int get cc voi...
c 多繼承和虛繼承
一 關於多繼承 菱形繼承 指的是b繼承a,c繼承a,d繼承b和c。下圖是菱形繼承的過程,以及各類的簡單的記憶體布局。菱形繼承存在的問題 間接基類的資料會出現多份導致訪問出錯,並且存在記憶體浪費 我們可以利用虛繼承來解決這一問題。二 虛繼承 虛繼承是物件導向程式設計中的一種技術,是指乙個指定的基類,在...
C 物件模型 單繼承,多繼承,虛繼承
有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...