c ++虚拟/非虚拟钻石继承

时间:2013-07-31 21:15:02

标签: c++ virtual-inheritance diamond-problem

在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()首先被调用?谢谢你提前给出的帮助和解释。

1 个答案:

答案 0 :(得分:1)

因为您实际上是继承B2,所以编译器将首先构造它,以便在构造任何非虚拟继承(C)之前识别哪些变量在B1中被虚拟继承。当然,A首先被构造,因为B2需要它才能构造它。