Question

If I define a structure that inherits from multiple other structures, how does the order that I list them in affect something like this:

struct D: C,B{
    D(): B(), C(){...}
};

Simple question, but thanks in advance!

Était-ce utile?

La solution

The order of construction depends on the sequence of inheritance. Initialization order doesn't matter. GCC actually issues warning in this case.

In constructor 'D::D()':

main.cpp:16:17: warning: base 'B' will be initialized after [-Wreorder]

 D(): B(), C(){
             ^

main.cpp:16:17: warning: base 'C' [-Wreorder]

main.cpp:16:5: warning: when initialized here [-Wreorder]

 D(): B(), C(){

It is clearly specified in the standard as well. From section 12.6.2 Initializing bases and members

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top