inherit1Inheritance basics
B::sum() - invoking the base class’s member functionw() macros for convenienceMemory layout of derived classes
reinterpret_castStatic vs. dynamic binding
Static binding by default unlike Java
Dynamic binding requries “virtual” function specifier:
virtual uint64_t sum() const { return b; }
“override” specifier ensures that the function is virtual and is overriding a virtual function from a base class:
uint64_t sum() const override { return B::sum() + d; }
Virtual function table (vtable)
inherit2Multiple inheritance object layout
Base pointers have different addresses
static_cast
Multiple inheritance with virtual functions
pb->sum() and pc->sum() polymorphically invoke D::sum()
Two vptrs are added to the object
dynamic_cast
(Optional) vtable layout
inherit3The diamond problem: D object contains two A portions
Base classes B & C still behave the same
But referring to the base class A is ambiguous
inherit4Virtual inheritance fixes the diamond problem
sum() behaves polymorphically via any base pointer
(Optional) D’s vtable layout
inherit5Order of initialization: base classes, data members, constructor body
Note the base class initialization syntaxt: B{100}
Destructors are called in the opposite order
Pure virtual function & abstract class
Virtual destructor