Search code examples
c++inheritancemultiple-inheritance

Multiple level of inheritance and calling base constructors in c++


I have the following classes that form a multilevel inheritance model.

class CavPkoTest : virtual public CavTest
{
public:
    CavPkoTest() : CavTest{CAV_TEST_ID_PKO}, NpBaseTest{CAV_TEST_ID_PKO, MODULE_CAV_TEST} {}
}
class CavTest : virtual public NpBaseTest
{
public:
    CavTest(uint16_t p_testId) : NpBaseTest{p_testId, MODULE_CAV_TEST} {}
}

class NpBaseTest
{
    uint16_t m_testId;
    uint16_t m_moduleType;
public:
    NpBaseTest(uint16_t p_testId, uint16_t p_moduleType) : m_testId{p_testId}, m_moduleType{p_moduleType} {}
}

My question is that when CavPkoTest() (leaf node) constructor is called, it delegates a call its parent class constructor CavTest(). CavTest() constructor is declared to explicitly calls its parent NpBaseTest() constructor. So why I am required to explicitly call NpBaseTest() constructor from CavPkoTest() when a call to CavTest() constructor should do it for me ?

If I declare CavPkoTest() constructor as :

class CavPkoTest : virtual public CavTest
{
public:
    CavPkoTest() : CavTest{CAV_TEST_ID_PKO} {}
}

FYI : Both CavTest and NpBaseTest classes are Abstract Base Classes since they have 1+ pure virtual member functions (which are implemented by CavPkoTest class)


Solution

  • With virtual inheritance, you can have multiple base classes deriving from the same virtual base class.

    That virtual base class sub-object must be initialized only once. Hence the language rule, that the derived class must initialize it explicitly.

    If the base classes were to initialize the same virtual base class sub-object, they would end up initializing it multiple times.