C 記憶體分布之單繼承和多繼承 無虛函式

2021-07-14 14:31:18 字數 1199 閱讀 8491

現在來介紹一下我的環境:

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...