Converting a pointer to a base class of an object,
when construction of that object has not started
or destruction of that object has finished,
has undefined behavior.
[Example 1: struct A {};
struct B :virtual A {};
struct C : B {};
struct D :virtual A { D(A*); };
struct X { X(A*); };
struct E : C, D, X {
E(): D(this), // undefined behavior, upcast from E* to A* might use path E*→D*→A*// but D is not constructed// “D((C*)this)'' would be defined, E*→C* is defined because E() has started,// and C*→A* is defined because C is fully constructed
X(this){}// defined, upon construction of X, C/B/D/A sublattice is fully constructed};
— end example]