У меня есть следующие классы, которые образуют многоуровневую модель наследования.Множество уровней наследования и вызывающих базовых конструкторов в C++
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} {}
}
FYI: Оба CavTest
и NpBaseTest
классы абстрактных базовых классов, так как они имеют 1+ чистые функции виртуальных членов (которые реализуются CavPkoTest
класса)
Все виртуальные базы считаются непосредственными базами. Вы должны называть их конструкторы от любых потомков на любом уровне, а не только от непосредственных детей. –