C++中的多级继承和调用基础构造函数
Multiple level of inheritance and calling base constructors in c++
我有以下 class 构成多级继承模型的元素。
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()
(叶节点)构造函数时,它委托调用其父 class 构造函数 CavTest()
。 CavTest()
构造函数声明为显式调用其父 NpBaseTest()
构造函数。那么,当调用 CavTest()
构造函数应该为我完成时,为什么我需要从 CavPkoTest()
显式调用 NpBaseTest()
构造函数?
如果我将 CavPkoTest()
构造函数声明为:
class CavPkoTest : virtual public CavTest
{
public:
CavPkoTest() : CavTest{CAV_TEST_ID_PKO} {}
}
仅供参考:CavTest
和 NpBaseTest
classes 都是抽象基础 类 因为它们有 1+ 个纯虚拟成员函数(由 CavPkoTest
class)
通过虚拟继承,您可以从同一个虚拟基 class.
派生多个基 classes
那个虚拟基地class sub-object 必须只初始化一次。因此,语言规则是派生的 class 必须显式初始化它。
如果基础 classes 初始化 same 虚拟基础 class sub-object,他们最终会初始化它多次.
我有以下 class 构成多级继承模型的元素。
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()
(叶节点)构造函数时,它委托调用其父 class 构造函数 CavTest()
。 CavTest()
构造函数声明为显式调用其父 NpBaseTest()
构造函数。那么,当调用 CavTest()
构造函数应该为我完成时,为什么我需要从 CavPkoTest()
显式调用 NpBaseTest()
构造函数?
如果我将 CavPkoTest()
构造函数声明为:
class CavPkoTest : virtual public CavTest
{
public:
CavPkoTest() : CavTest{CAV_TEST_ID_PKO} {}
}
仅供参考:CavTest
和 NpBaseTest
classes 都是抽象基础 类 因为它们有 1+ 个纯虚拟成员函数(由 CavPkoTest
class)
通过虚拟继承,您可以从同一个虚拟基 class.
派生多个基 classes那个虚拟基地class sub-object 必须只初始化一次。因此,语言规则是派生的 class 必须显式初始化它。
如果基础 classes 初始化 same 虚拟基础 class sub-object,他们最终会初始化它多次.