C++菱形繼承的內存模型(VS2017環(huán)境)

1.菱形繼承簡要介紹

??首先簡單介紹一下菱形繼承崖面,由于C++支持多繼承,因此會產生菱形繼承這種情況(如圖1所示)另萤。在這種情況下轿塔,如果類D的對象 b\_instance 想要訪問成員 a,如果直接通過 b\_instace.a 訪問仲墨,由于編譯器不知道應該是找類 B 繼承的成員 B::a ,還是 C::a揍障,由此產生二義性目养,編譯報錯(注:b\_instance 必須明確指定,比如 b\_instance.B::a 這樣才能正確通過編譯)毒嫡。

圖1.菱形繼承示意圖

??為了解決這個問題癌蚁,C++提供了一種虛繼承的機制,在這種機制下兜畸,子對象只保留父對象共有成員的一份拷貝努释,因此不會存在二義性的問題。下面是我在VS2017-x86模式下咬摇,反匯編后伐蒂,將其內存布局簡要刻畫出來(圖2)。

2.菱形繼承內存布局刻畫
  • 源碼示例
#include<iostream>
using namespace std;

class A{
public:
    int a;
    A(int _a):a(_a){};
    virtual void show() { cout << "This is A::show()." << endl; }
}

class B: virtual public A{
public:
    int b;
    B(int _a, int _b):A(_a),b(_b){};
    virtual void show(){ cout << "This is B::show()." << endl;  }
}

class C: virtual public A{
public:
    int c;
    C(int _a, int _c):A(_a),c(_c){};
    virtual void show(){ cout << "This is C::show()." << endl; }
}

class D: public B, public C{
public:
    int d;
    D(int _a, int _b, int _c, int _d):A(_a),B(_a,_b),C(_a,_c),d(_d){};
    virtual void show(){ cout << "This is D::show()." << endl; }
}
  • 其內存布局如圖2所示肛鹏,其中每個虛繼承的子類存在一個虛基類表指針逸邦,該指針指向的地方存在一個偏移值 offset,該偏移值 offset 指示當前類中虛表指針(當沒有虛函數(shù)時在扰,指向虛基類數(shù)據(jù)成員)的位置缕减。
    圖2. 菱形繼承內存布局示意圖
3.總結
  • 在存在虛繼承的類中,會存在虛基類指針芒珠,該指針指向的地方存放一個偏移,這個偏移為虛基類指針到虛基類數(shù)據(jù)的偏移;
  • 子類只保存一份虛基類的數(shù)據(jù)對象蘸秘,這樣可以防止二義性;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末部逮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子局雄,更是在濱河造成了極大的恐慌甥啄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炬搭,死亡現(xiàn)場離奇詭異蜈漓,居然都是意外死亡,警方通過查閱死者的電腦和手機宫盔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門融虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灼芭,你說我怎么就攤上這事有额。” “怎么了彼绷?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵巍佑,是天一觀的道長。 經(jīng)常有香客問我寄悯,道長萤衰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任猜旬,我火速辦了婚禮脆栋,結果婚禮上,老公的妹妹穿的比我還像新娘洒擦。我一直安慰自己椿争,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布熟嫩。 她就那樣靜靜地躺著秦踪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邦危。 梳的紋絲不亂的頭發(fā)上洋侨,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音倦蚪,去河邊找鬼希坚。 笑死,一個胖子當著我的面吹牛陵且,可吹牛的內容都是我干的裁僧。 我是一名探鬼主播个束,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聊疲!你這毒婦竟也來了茬底?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤获洲,失蹤者是張志新(化名)和其女友劉穎阱表,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贡珊,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡最爬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了门岔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱致。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寒随,靈堂內的尸體忽然破棺而出糠悯,到底是詐尸還是另有隱情,我是刑警寧澤妻往,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布互艾,位于F島的核電站,受9級特大地震影響讯泣,放射性物質發(fā)生泄漏忘朝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一判帮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉箕,春花似錦晦墙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寡痰,卻和暖如春抗楔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拦坠。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工连躏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贞滨。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓入热,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勺良,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容