簡體   English   中英

C ++虛擬/非虛擬鑽石繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM