二.虛繼承 與 虛函式 完全不相關的兩個東西
三.總結
首先利用菱形繼承的案例(如下),說明如果派生類d中會出現兩個_a,乙個是b::_a, 還有乙個是 c::_a, 這樣便會有二義性,導致編譯器報錯。
#include
using
namespace std;
//菱形繼承案例
classa;
classb:
public a
;classc:
public a
;classd:
public b,
public c};
void
showsize()
intmain()
1.(沒有虛繼承)記憶體布局:
使用虛繼承:
#include
using
namespace std;
//菱形繼承案例
classa;
classb:
virtual
public a
;classc:
virtual
public a
;classd:
public b,
public c};
intmain()
2.有虛繼承的記憶體布局:
這裡說明一下記憶體布局,如b:0 ~ 4位元組 存放, 4 ~ 8 位元組 存放_b, 8 ~ 12 位元組用來存放 _a, 那麼b 一共占用12 位元組, c也是同理。
再來說明d 的記憶體分布, 0 ~ 8 位元組存放 b 的 和_b, 8 ~ 16 位元組存放 c的 和_c,再存放乙個 _a, _d
這兩者實際完全不相關:
#include
#include
#include
#include
#include
using
namespace std;
/*虛繼承與虛函式表:
注意,如果是進行了虛繼承之後,就不再需要使用虛函式表了,如下面的程式(原因是虛基表中已經存放了虛基類,並不會出現二義性):
*/classa~
a()void
print()
int a =10;
};classa1:
virtual
public a~a1
()void
print()
int a =1;
};classa2:
virtual
public a~a2
()void
print()
int a =2;
};classb:
public a1,
public a2~b
()void
display()
void
print()
};intmain()
虛基表與虛函式表是兩個完全不同的概念,也用來解決完全不同的問題:
1.虛基表:表中存放的是虛基類(如上面的class a),用來解決繼承的二義性,是為了避免派生類中儲存相同的成員。
2.虛函式:表中存放的是函式,用來實現泛型程式設計,執行時多型。
多重繼承 虛繼承與虛基類
一 多重繼承 單重繼承 乙個派生類最多只能有乙個基類 多重繼承 乙個派生類可以有多個基類 class 類名 繼承方式 基類1,繼承方式 基類2,派生類同時繼承多個基類的成員,更好的軟體重用 可能會有大量的二義性,多個基類中可能包含同名變數或函式 多重繼承中解決訪問歧義的方法 基類名 資料成員名 或成...
C 虛繼承實現原理(虛基類表指標與虛基類表)
虛繼承和虛函式是完全無相關的兩個概念。虛繼承是解決c 多重繼承問題的一種手段,從不同途徑繼承來的同一基類,會在子類中存在多份拷貝。這將存在兩個問題 其一,浪費儲存空間 第二,存在二義性問題,通常可以將派生類物件的位址賦值給基類物件,實現的具體方式是,將基類指標指向繼承類 繼承類有基類的拷貝 中的基類...
C 多繼承與虛基類
多繼承的定義 派生類的基類大於乙個 語法 class 派生類名 繼承方式1 基類名1,繼承方式2 基類名2.多重繼承與建構函式的關係 多重繼承時建構函式的作用 1 初始化派生類 自己 2 呼叫該派生類所有基類建構函式,並且為所有基類傳參 引數個數必須包含所有基類所需引數 建構函式語法 派生類建構函式...