虛繼承 構造順序

如下的菱形結構,四個字母分別表示一個類名

      A
  B    C
      D

說明:B和C均繼承A, D繼承B和C

下面是我調試的5種情況的結果,請大家幫忙分析一下:

1. 若所有繼承均爲普通繼承,則構造函數的調用順序如下:A B A C D
2. 若僅僅A->B爲虛繼承,則構造函數的調用順序如下:A B A C D
3. 若僅僅A->C爲虛繼承,則構造函數的調用順序如下:A A B C D
4. 若僅僅B->D爲虛繼承,則構造函數的調用順序如下:A B A C D
2. 若僅僅C->D爲虛繼承,則構造函數的調用順序如下:A C A B D

虛繼承應該是最終子類優先執行虛繼承的基類的構造函數,然後再按正常順序調用各構造函數

像第3種情況,C虛繼承A,其執行順序爲:
1、D->A:D類先執行虛繼承的基類A的構造函數
2、D->B->A:D類再執行直接父類B的構造函數,而B則先執行直接父類A的構造函數
3、D->C->(A):D類再執行直接父類C的構造函數,而C本來應該先執行直接父類A的構造函數,但由於虛繼承,A的構造函數在第1步已經執行過了,故不再執行
故最終的順序爲AABCD

像第5種情況,D虛繼承C,其執行順序爲:
1、D->C->A:D類先執行虛繼承的基類C的構造函數,而C則先執行直接父類A的構造函數
2、D->B->A:D類再執行直接父類B的構造函數,而B則先執行直接父類A的構造函數
3、D->(C):D類再執行直接父類C的構造函數,但由於虛繼承,C的構造函數在第1步已經執行過了,故不再執行
故最終的順序爲ACABD


6. 若A->B爲虛繼承,同時A->C也爲虛繼承,則構造函數的調用順序如下:A B C D
其執行順序爲:
1、D->A:D類先執行虛繼承的基類A的構造函數
2、D->B->(A):D類先執行虛繼承的基類B的構造函數,而B則先執行直接父類A的構造函數,但由於虛繼承,A的構造函數在第1步已經執行過了,故不再執行
3、D->C->(A):D類再執行直接父類C的構造函數,而C則先執行直接父類A的構造函數,但由於虛繼承,A的構造函數在第1步已經執行過了,故不再執行
故最終的順序爲ABCD

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章