[英]c++ Virtual/Non-virtual Diamond inheritance
在C ++中給出以下代碼:
struct A {
A() { f(0); }
A(int i) { f(i); }
virtual void f(int i) { cout << i; }
};
struct B1 : virtual A {
B1(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+10; }
};
struct B2 : virtual A {
B2(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+20; }
};
struct C : B1, virtual B2 {
int i;
C() : B1(6),B2(3),A(1){}
virtual void f(int i) { cout << i+30; }
};
有人可以解釋為什么C* c = new C()
; 會依次打印1 23和16? 如何確定打印順序? 我知道非虛擬B1
將被最后調用,但是為什么A()
被首先調用? 感謝您的幫助和提前解釋。
因為您實際上是在繼承B2
,所以編譯器將在構造任何非虛擬繼承( B1
)之前先構造它,以識別哪些變量在C
中實際上是繼承的。 當然,首先要構造A
,因為B2
需要先構造它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.