前面介紹了單繼承以及正常多繼承的記憶體分布情況,最後介紹一種虛繼承的情況。同時虛繼承也是解決多繼承二義性的一種手段。
首先將**改動如下,
base1跟base11是完全一樣的**,除了繼承的時候base1是虛繼承,我們先看下單繼承的時候,虛繼承的記憶體分布跟非虛繼承有什麼區別。
可以看到虛繼承的記憶體分布要複雜的多。有兩個vftable以及乙個vbtable。第乙個表是base1本身的,第二個虛表是父類base的。而vbtable叫虛基類表,它記錄了類繼承的所有的虛基類子物件在本類定義的物件內的偏移位置。
接下來,我們看更複雜的情況。
subbase繼承了倆個類,且這兩個類都採用了虛繼承的方式繼承了乙個共同的base。
記憶體分布可以看到,首先是直接基類base1, base2的vftable,接著是他們各自的vbtable,而對於共同基類base的vftable則放在了最後,這也保證了不管有多少個基類,都可以很容易的找到他們共同的基類。
C 多繼承 虛繼承
一,多繼承 include include using namespace std class b1 繼承類c void main 主函式 c類按照順序繼承b2,b1,b4,b3 再按照資料成員定義順序 memberb1,memberb4,memberb3,memberb2 最後是自己的構造器 二,...
虛繼承及繼承的記憶體布局
1.為什麼需要虛繼承 如下圖所示如果訪問der fun or der m nvalue就會帶來二義性,無法確定是呼叫base1的還是base2的,所以為了解決多重繼承情況下成員訪問的二義性,引入了虛繼承機制。一般繼承 虛繼承 2.虛繼承實現 在虛繼承下,der通過共享虛基類superbase來避免二...
C 多繼承 菱形繼承 虛繼承
b和c都單繼承了a d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承 class a public int ma class b public a public int mb class c public a public int mc class d public b,public c ...