我有以下类形成多级继承模型。
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} {}
}
仅供参考:CavTest
和NpBaseTest
类都是抽象基类,因为它们有1个以上的纯虚拟成员函数(由CavPkoTest
类实现)
答案 0 :(得分:1)
使用虚拟继承,您可以从同一个虚拟基类派生多个基类。
该虚拟基类子对象必须只初始化一次。因此语言规则,派生类必须显式初始化它。
如果基类要初始化相同的虚拟基类子对象,他们最终会多次初始化它。