[英]Does “virtual base class in the case of multilevel inheritance” have significance
[英]Not able to understand virtual base class constructor in case of multilevel inheritance
在以下程序中如果我更改Derived類“D”中的序列,那么我得到基類構造函數的不同順序。
#include <iostream>
using namespace std;
class A {
public :
A ()
{
cout << "A()" <<endl;
}
};
class B : virtual A{
public :
B ()
{
cout << "B()" << endl;
}
};
class C : virtual B{
public :
C ()
{
cout << "C()" << endl;
}
};
Case (1)
========
class D : public A, public B, public C
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
A()
B()
C()
Case (2)
========
class D : public C, public B, public A
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
C()
B()
A()
Case (3)
========
class D : public B, public A, public C
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
B()
A()
C()
請問任何人都可以告訴如何在虛擬類概念的情況下調用構造函數。
請問任何人都可以告訴如何在虛擬類概念的情況下調用構造函數。
根據初始化順序 ,首先初始化虛擬基類。
1)如果構造函數是用於派生程度最高的類,則虛擬基類按它們在基類聲明的深度優先從左到右的遍歷中出現的順序進行初始化(從左到右指的是外觀)在基本說明符列表中)
2)然后,直接基類按從左到右的順序初始化,因為它們出現在此類的基本說明符列表中
3)然后,按照類定義中的聲明順序初始化非靜態數據成員。
4)最后,執行構造函數的主體
在所有的3例,類D
是從繼承A
, B
,和C
,那里是在兩個虛擬基類D
,即A
經由繼承了B
和C
,和B
通過繼承了C
。 A
將首先初始化,因為它是最基類的,因此對於所有3種情況, A()
和B()
將首先打印出來。
之后,直接基類將按從左到右的順序初始化。 對於第一種情況,它們將是A()
B()
C()
,對於第二種情況,它們將是B()
C()
A()
,對於第三種情況,它們將是B()
A()
C()
。
始終在DFS后訂單中首先初始化虛擬基礎。 這保證了虛擬A和B基礎將首先被初始化,而A在B之前被初始化,因為B是從A得到的。之后,三個非虛擬基數A,B,C按照您的預期簡單地按聲明順序初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.