日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++虚继承下的内存模型(二)

發布時間:2025/4/5 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++虚继承下的内存模型(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于虛繼承,恰恰和普通繼承相反,大部分編譯器會把基類成員變量放在派生類成員變量的后面,這樣隨著繼承層級的增加,基類成員變量的偏移就會改變,就得通過其他方案來計算偏移量。

下面我們來一步一步地分析虛繼承時的對象內存模型。

  • 修改上面的代碼,使得 A 是 B 的虛基類:
  • #include <iostream> using namespace std;class A{ protected:int m_a1;int m_a2; }; class B: virtual public A{ protected:int b1;int b2; }; class C: public B{ protected:int c1;int c2; }; class D: public C{ protected:int d1;int d2; }; int main(){A obj_a;B obj_b;C obj_c;D obj_d;return 0; }

    此時 obj_b、obj_c、obj_d 的內存模型就會發生變化,如下圖所示:


    不管是虛基類的直接派生類還是間接派生類,虛基類的子對象始終位于派生類對象的最后面。

  • 再假設 A 是 B 的虛基類,B 又是 C 的虛基類,那么各個對象的內存模型如下圖所示:

  • 從上面的兩張圖中可以發現,虛繼承時的派生類對象被分成了兩部分:

    • 不帶陰影的一部分偏移量固定,不會隨著繼承層次的增加而改變,稱為固定部分;
    • 帶有陰影的一部分是虛基類的子對象,偏移量會隨著繼承層次的增加而改變,稱為共享部分。

    當要訪問對象的成員變量時,需要知道對象的首地址和變量的偏移,對象的首地址很好獲得,關鍵是變量的偏移。對于固定部分,偏移是不變的,很好計算;而對于共享部分,偏移會隨著繼承層次的增加而改變,這就需要設計一種方案,在偏移不斷變化的過程中準確地計算偏移。各個編譯器正是在設計這一方案時出現了分歧,不同的編譯器設計了不同的方案來計算共享部分的偏移。

    對于虛繼承,將派生類分為固定部分和共享部分,并把共享部分放在最后,幾乎所有的編譯器都在這一點上達成了共識。主要的分歧就是如何計算共享部分的偏移,可謂是百花齊放,沒有統一標準。

    總結

    以上是生活随笔為你收集整理的C++虚继承下的内存模型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。