У меня проблемы с решением подобных вопросов. На экзамене, который я собираюсь сдать через несколько дней, они показывают программу на C++
, которая имеет множественное наследование:
struct X {
X(){cout << "X" << endl;}
};
struct A : virtual X {
int i;
A(){cout << "A" << endl;}
};
struct B : A {
int i;
B(){cout << "B" << endl;}
virtual void f() {cout << "f" << endl;}
};
struct C : A {
int i;
C(){cout << "C" << endl;}
C(int i){cout << "C2" << endl;}
virtual void g() {cout << "g" << endl;}
};
struct D : virtual B, virtual C {
int i;
D( int i) : C(i), B() {cout << "D" << endl;}
};
И показать код из основного:
D* d = new D(2014);
C* c = d;
B* b = d;
А чем спросить "какой будет выход?" Мне не нужно решение, я всегда могу
просто запустите или отладьте его, но мне нужно понять интуицию, потому что на экзамене у меня не будет отладчика. Теперь я знаю алгоритм, которому нужно следовать:
5 Инициализация должна выполняться в следующем порядке:
- Сначала и только для конструктора самого производного класса, как
описанные ниже, виртуальные базовые классы должны быть инициализированы в
Порядок, в котором они появляются на глубине первого обхода слева направо
направленный ациклический граф базовых классов, где «слева направо»
порядок появления имен базового класса в производном классе
базовый спецификатор-лист.
- Затем прямые базовые классы должны быть инициализированы в порядке объявления
как они появляются в списке базовых спецификаторов (независимо от порядка
mem-инициализаторы).
- Затем элементы нестатических данных должны быть инициализированы в том порядке, в котором они
были объявлены в определении класса (опять же, независимо от порядка
mem-инициализаторов).
- Наконец, тело конструктора выполняется. [Обратите внимание
Порядок декларации уполномочен гарантировать, что база и член
подобъекты уничтожаются в обратном порядке инициализации. ]
Но я действительно плохо решаю их, это не имеет никакого смысла. Можно ли показать интуицию, может быть, хитрость или совет по решению подобных вопросов? Может быть, показать темные углы? Может быть, как-то записать все классы / структуры, как-то написать классы vbase, чтобы было легко увидеть вывод?