Understanding how to initialize constructors in the Multiple Inheritance

207 views Asked by At

I having hard time in solving those kind of question. In an exam I going to take in a few days, they show a program in C++ which has Multiple Inheritance:

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;}
};

And show some code from main:

D* d = new D(2014);
C* c = d;
B* b = d;

And than ask "what will be the output?" I don't need the solution, I can always just run or debug it but I need to understand the intuition because I will not have the debugger with me on the exam. Now I know the algorithm I need to follow:

5 Initialization shall proceed in the following order:

— First, and only for the constructor of the most derived class as described below, virtual base classes shall be initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes, where “left-to-right” is the order of appearance of the base class names in the derived class base-specifier-list.

— Then, direct base classes shall be initialized in declaration order as they appear in the base-specifier-list (regardless of the order of the mem-initializers).

— Then, nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

— Finally, the body of the constructor is executed. [Note: the declaration order is mandated to ensure that base and member subobjects are destroyed in the reverse order of initialization. ]

But I really having bad time solving them, it does not make any sense. Is it possible to show the intuition, maybe a trick or tip on solving those kind of questions? Maybe to show dark corners? Maybe somehow to write down all the classes/structs, write the vbase classes somehow in order to easy see to output?

0

There are 0 answers