С++ Виртуальное/невиртуальное наследование Diamond

Учитывая следующий код на 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() вызывается первым? Спасибо за помощь и объяснение заранее.


person Wes Field    schedule 31.07.2013    source источник
comment
A является базой B2, поэтому он должен быть построен до B2.   -  person Kerrek SB    schedule 01.08.2013
comment
Дубликаты: stackoverflow.com/questions/6247595/ и stackoverflow.com/questions/2669888/ ? Если вы посмотрите порядок инициализации базовых классов, вы найдете много материала для чтения :)   -  person Jens    schedule 01.08.2013


Ответы (1)


Поскольку вы фактически наследуете B2, компилятор сначала создаст его, чтобы определить, какие переменные виртуально унаследованы в C, прежде чем он создаст какое-либо невиртуальное наследование (B1). Конечно, A создается первым, потому что B2 нуждается в нем до того, как его можно будет построить.

person Lochemage    schedule 31.07.2013