c 多繼承和虛繼承

2021-09-25 23:52:28 字數 1686 閱讀 9456

一、關於多繼承

菱形繼承:指的是b繼承a,c繼承a,d繼承b和c。下圖是菱形繼承的過程,以及各類的簡單的記憶體布局。

菱形繼承存在的問題:間接基類的資料會出現多份導致訪問出錯,並且存在記憶體浪費;我們可以利用虛繼承來解決這一問題。

二、虛繼承

虛繼承是物件導向程式設計中的一種技術,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基型別直接或間接派生的其它類。虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。(來自百科的解釋)

在虛繼承**現了以下的概念,虛基類指標和虛基類表;

虛基類指標指向虛基類表。虛基類表中有兩項,一是vbptr的偏移,二是vbptr所指向的作用域的偏移;

注意:虛基類的構造優先順序高;

虛基類的處理順序:與繼承順序有關;

三、虛繼承的記憶體布局

多繼承下的記憶體布局:非虛基類布局優先於虛基類;

(1)b虛繼承a,c虛繼承a,d虛繼承b且繼承c,以下給出d的記憶體布局圖:

(2)b虛繼承a,c虛繼承a,d虛繼承b且繼承c,且虛繼承e,給出d的記憶體布局:

(3)看以下的**,給出d的記憶體布局

注意:虛函式指標的偏移是相對於整體作用域的。四、實現乙個不能被繼承的類

不能被繼承的類一是不能被繼承,二是能正常使用;

templateclass base

friend t;

};class a:virtual public base

protected:

int ma;

};class b :public a

protected:

int mb;

};int main()

錯誤資訊:

注意友元的使用以及其特點:

一單向性

二不可繼承

三不可傳遞 

C 多繼承 虛繼承

一,多繼承 include include using namespace std class b1 繼承類c void main 主函式 c類按照順序繼承b2,b1,b4,b3 再按照資料成員定義順序 memberb1,memberb4,memberb3,memberb2 最後是自己的構造器 二,...

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 ...

C 多繼承與虛繼承

目錄 多繼承與虛繼承以及存在的問題 例子 虛繼承有了多繼承,虛繼承才會有意義 如果有個菱形結構的繼承,爺爺類為a,然後b,c是a的派生類,最後d是b和c的派生類,如果在a中有乙個成員變數a,d去呼叫就會出現訪問不明確,虛繼承就可以解決訪問不明確的這種問題 如果這樣繼承b,c虛繼承了a,virtual...