c ++ Виртуальное / не виртуальное наследование 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() называется первым? Спасибо за помощь и объяснение заранее.

0

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector