C++虚继承下的内存模型(二)
生活随笔
收集整理的這篇文章主要介紹了
C++虚继承下的内存模型(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于虛繼承,恰恰和普通繼承相反,大部分編譯器會把基類成員變量放在派生類成員變量的后面,這樣隨著繼承層級的增加,基類成員變量的偏移就會改變,就得通過其他方案來計算偏移量。
下面我們來一步一步地分析虛繼承時的對象內存模型。
此時 obj_b、obj_c、obj_d 的內存模型就會發生變化,如下圖所示:
不管是虛基類的直接派生類還是間接派生類,虛基類的子對象始終位于派生類對象的最后面。
從上面的兩張圖中可以發現,虛繼承時的派生類對象被分成了兩部分:
- 不帶陰影的一部分偏移量固定,不會隨著繼承層次的增加而改變,稱為固定部分;
- 帶有陰影的一部分是虛基類的子對象,偏移量會隨著繼承層次的增加而改變,稱為共享部分。
當要訪問對象的成員變量時,需要知道對象的首地址和變量的偏移,對象的首地址很好獲得,關鍵是變量的偏移。對于固定部分,偏移是不變的,很好計算;而對于共享部分,偏移會隨著繼承層次的增加而改變,這就需要設計一種方案,在偏移不斷變化的過程中準確地計算偏移。各個編譯器正是在設計這一方案時出現了分歧,不同的編譯器設計了不同的方案來計算共享部分的偏移。
對于虛繼承,將派生類分為固定部分和共享部分,并把共享部分放在最后,幾乎所有的編譯器都在這一點上達成了共識。主要的分歧就是如何計算共享部分的偏移,可謂是百花齊放,沒有統一標準。總結
以上是生活随笔為你收集整理的C++虚继承下的内存模型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++虚继承下的内存模型(一)
- 下一篇: C++将派生类赋值给基类(向上转型)(一