, : Derived* -> void* -> IObject* - undefined , C ++. , void* C - .
, , , void* T -> void* -> T: . , Derived* -> IObject* -> void* -> IObject*.
, virtual , , ( ). ( Itanium ABI).
:
struct Base { int a; };
struct Derived: Base { int b; };
struct SuperDerived: Derived { int c; };
+---+---+
| a | b |
+---+---+
^~~~~~~~~ Derived
^~~~~ Derived specific
^~~~~ Base
+---+---+---+
| a | b | c |
+---+---+---+
^~~~~~~~~~~~~ SuperDerived
^~~~~ SuperDerived specific
^~~~~~~~~ Derived
^~~~~ Base
&derived == &base &superderived == &derived ( : , , ).
struct Base1 { int a; };
struct Base2 { int b; };
struct Derived: Base1, Base2 { int c; };
+---+---+---+
| a | b | c |
+---+---+---+
^~~~~~~~~~~~~ Derived
^~~~~ Derived specific
^~~~~ Base2
^~~~~ Base1
&derived == &base1, &derived != &base2, , , .
, , push virtual inheritance :
struct Object { int a; };
struct Base1: virtual Object { int b; };
struct Base2: virtual Object { int c; };
struct Derived: Base1, Base2 { int d; };
+---+---+
| b | a |
+---+---+
^~~~~~~~~ Complete Base1
^~~~~ Base1 specific
^~~~~ Object
+---+---+
| c | a |
+---+---+
^~~~~~~~~ Complete Base2
^~~~~ Base2 specific
^~~~~ Object
+---+---+---+---+
| b | c | d | a |
+---+---+---+---+
^~~~~~~~~~~~~~~~~ Complete Derived
^~~~~ Derived specific
^~~~~ Incomplete Base1
^~~~~ Incomplete Base2
^~~~~ Object
, . , , , ( ) , , runtime, Object .
, , &base1 != &object, &base2 != &object &derived != &object, Object .
++-, , ( ) , .
: ++ , , , , static_cast<Base1*>(&object) , dynamic_cast.