多重繼承 虛繼承與虛基類

2021-09-07 16:59:51 字數 4417 閱讀 1806

一、多重繼承

單重繼承——乙個派生類最多只能有乙個基類

多重繼承——乙個派生類可以有多個基類

class 類名: 繼承方式 基類1,繼承方式 基類2,…. ;

派生類同時繼承多個基類的成員,更好的軟體重用

可能會有大量的二義性,多個基類中可能包含同名變數或函式

多重繼承中解決訪問歧義的方法:

基類名::資料成員名(或成員函式(參數列))

明確指明要訪問定義於哪個基類中的成員

c++ code  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

#include 

using namespace std;

class bed

void sleep()

int weight_;

};class sofa

void watchtv()

int weight_;

};class sofabed : public bed, public sofa

void foldout()

void foldin()

};int main(void)

不能直接寫 sofabed.weight_ = 10; 因為sofabed 繼承了sofa 和 bed ,實際上有weigh_的兩份拷貝,這樣指向不明。只能通過

sofabed.bed::weight_ = 10; 訪問,但實際上乙個sofabed理應只有乙個weight_,下面通過虛基類和虛繼承可以解決這個問題。

二、虛繼承與虛基類

當派生類從多個基類派生,而這些基類又從同乙個基類派生,則在訪問此共同基類中的成員時,將產生二義性,可以採用虛基類來解決。

虛基類的引入

用於有共同基類的場合

宣告

以virtual修飾說明基類 例:class b1:virtual public bb

作用

主要用來解決多繼承時可能發生的對同一基類繼承多次而產生的二義性問題.

為最遠的派生類提供唯一的基類成員,而不重複產生多次拷貝

此時只有乙份weigh_,不存在訪問歧義的問題。

從輸出可以總結出:

1、虛基類的成員是由最遠派生類的建構函式通過呼叫虛基類的建構函式進行初始化的。

2、在整個繼承結構中,直接或間接繼承虛基類的所有派生類,都必須在建構函式的成員初始化表中給出對虛基類的建構函式的呼叫。如果未列出,則表示呼叫該虛基類的預設建構函式。

3、在建立物件時,只有最遠派生類的構造函式呼叫虛基類的建構函式,該派生類的其他基類對虛基類建構函式的呼叫被忽略。

參考:c++ primer 第四版

effective c++ 3rd

c++程式設計規範

多重繼承與虛基類

多重繼承 multiple inheritance,mi 虛基類虛基類使得從多個類 它們的基類相同 派生出的物件只繼承乙個基類物件。通過使用關鍵字virtual。例如,可以使worker被用作singer和waiter的虛基類 virtual和public的次序無關緊要 class singer v...

多重繼承與虛基類

多重繼承 前面我們介紹的派生類只有乙個基類,稱為單基派生或單一繼承。在實際運用中,我們經常需要派生類同時具有多個基類,這種方法稱為多基派生或多重繼承。2.1 多重繼承的宣告 在 c 中,宣告具有兩個以上基類的派生類與宣告單基派生類的形式類似,只需將要繼承的多個基類用逗號分開即可。在多重繼承中,公有派...

C 多重繼承與虛基類

多重繼承就是乙個派生類繼承了多個基類。i 通過成員初始化列表指定建構函式 class d public b,public c ii 構造函式呼叫順序 class b void f class c void f class d public b,public c void f int main 輸出 ...