Понимание того, как инициализировать конструкторы в множественном наследовании - PullRequest
0 голосов
/ 06 июля 2019

У меня проблемы с решением подобных вопросов. На экзамене, который я собираюсь сдать через несколько дней, они показывают программу на 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, чтобы было легко увидеть вывод?

...