C 問題28 虛繼承

2021-10-25 05:25:23 字數 1469 閱讀 8148

乙個派生類是由多個基類繼承過來的

**如下:

/**

普通繼承(沒有使用虛基類)

*/#includeusing namespace std;

// 基類a

class a

;class b : public a

;class c : public a

;class d : public b, public c

;int main()

結果如下:

菱形繼承記憶體布局:

從類d的記憶體布局可以看到a派生出b和c,b和c中分別包含a的成員。再由b和c派生出d,此時d包含了b和c的成員。這樣d中就總共出現了2個a成員。大家注意到結果的幾個數字,這幾個數字表明了d中各成員在d中的大小,d中的五個成員變數(b::dataa、datab、c::dataa、datac、datad)各占用4個位元組,sizeof(d) = 20。

**如下:

#includeusing namespace std;

class a //大小為4

;class b :virtual public a //大小為12,變數a,b共8位元組,虛基類表指標4

;class c :virtual public a //與b一樣12 ,變數a,c共8位元組,虛基類表指標4

;class d :public b, public c //24,變數a,b,c,d共16,b的虛基類指標4,c的虛基類指標

;int main()

結果如下:

菱形虛繼承子類的記憶體分布:

vbtable 和 vbptr

我們可以看到,菱形繼承體系中的子類在記憶體布局上和普通多繼承體系中的子類類有很大的不一樣。對於類b和c,sizeof的值變成了12,除了包含類a的成員變數dataa外還多了乙個指標vbptr,類d除了繼承b、c各自的成員變數datab、dataa和自己的成員變數外,還有兩個分別屬於b、c的指標。

實際上,vbptr指的是虛基類表指標,該指標指向了乙個虛表vbtable,

(1)虛表中記錄了vbptr與本類的偏移位址;

(2)vbptr到共有基類元素之間的偏移量。

C 虛繼承和虛繼承

虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...

c 之虛繼承 多重繼承的問題

什麼是多重繼承 如圖 什麼是多繼承 如圖 繼承中的特殊結構 菱形繼承結構帶來的問題,d會有兩個a中的資料成員 class a class b public a class c public a class d public b,public c d中會有兩個a乙個是從b繼承的,乙個是從c繼承的 出現...

虛函式 虛繼承 C

關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...