c ++中的多级继承和调用基础构造函数

时间:2017-02-06 17:06:50

标签: c++ inheritance multiple-inheritance

我有以下类形成多级继承模型。

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} {}
}

我的问题是,当调用CavPkoTest()(叶子节点)构造函数时,它会将一个调用委托给它的父类构造函数CavTest()。声明CavTest()构造函数显式调用其父NpBaseTest()构造函数。那么,当NpBaseTest()构造函数的调用应该为我执行时,为什么我需要从CavPkoTest()显式调用CavTest()构造函数?

如果我将CavPkoTest()构造函数声明为:

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

仅供参考:CavTestNpBaseTest类都是抽象基类,因为它们有1个以上的纯虚拟成员函数(由CavPkoTest类实现)

1 个答案:

答案 0 :(得分:1)

使用虚拟继承,您可以从同一个虚拟基类派生多个基类。

该虚拟基类子对象必须只初始化一次。因此语言规则,派生类必须显式初始化它。

如果基类要初始化相同的虚拟基类子对象,他们最终会多次初始化它。