一、關於多繼承
菱形繼承:指的是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...