C 繼承與多型 三 虛基表與虛繼承

2021-10-02 03:42:03 字數 1924 閱讀 2358

二.虛繼承 與 虛函式 完全不相關的兩個東西

三.總結

首先利用菱形繼承的案例(如下),說明如果派生類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 呼叫該派生類所有基類建構函式,並且為所有基類傳參 引數個數必須包含所有基類所需引數 建構函式語法 派生類建構函式...