Hi,
is there a (practicable) way to by-pass the normal (virtual) constructor calling order? (Hard to describe in one sentence, see the)
Example:
class A
{
const int i;
public:
A()
: i(0)
{ cout << "calling A()" << endl; }
A(int p)
: i(p)
{ cout << "calling A(int)" << endl; }
};
class B
: public virtual A
{
public:
B(int i)
: A(i)
{ cout << "calling B(int)" << endl; }
};
class C
: public B
{
public:
C(int i)
: A(i), B(i)
{ cout << "calling C(int)" << endl; }
};
class D
: public C
{
public:
D(int i)
: /*A(i), */ C(i)
{ cout << "calling D(int)" << endl; }
};
int main()
{
D d(42);
return 0;
}
Output:
calling A()
calling B(int)
calling C(int)
calling D(int)
What i want to have is something like:
calling A(int)
calling B(int)
calling C(int)
calling D(int)
As you see, there is virtual inheritance involved, which leads the constructor of D to call the constructor of A first, but since no parameter is provided, it calls A(). There's the const int i that needs initialisation, so I've got a problem.
What I'd like to do is to hide the inheritance details of C, that's why I'm looking for a way to avoid calling A(i) in D's (and every derived) constructor's initialisation list. [edit] In this specific case, I can assume there are only non-virtual single-inheritance child classes of C (as D is one). [/edit]
[edit]
Virtual base classes are initialized before any non-virtual base classes are initialized, so only the most derived class can initialize virtual base classes. – James McNellis
That's exactly the point, I don't want the most derived class to call the virtual base class constructor. [/edit]
Consider the following situation (not represented in the code example above):
A
/ \
B0 B1
\ /
C
|
D
I understand why C has to call the ctor of A (ambiguity) when you instanciate C, but why does D have to call it when instanciating D?
Thanks in advance for any suggestion.