2017-02-06 19 views
0

私は、以下のクラスを持っていて、複数レベルの継承モデルを形成しています。複数レベルの継承と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()コンストラクタを明示的に呼び出すように宣言されています。では、CavTest()コンストラクタへの呼び出しが私のためにそれを行うべきである場合、なぜからNpBaseTest()コンストラクタを明示的に呼び出す必要がありますか?

IとしてCavPkoTest()コンストラクタを宣言する場合:

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

FYI:それらは(CavPkoTestクラスによって実装される)1+純粋仮想メンバ関数

+0

すべての仮想ベースは即時ベースとみなされます。直接の子どもだけでなく、どのレベルの子孫からでもコンストラクタを呼び出さなければなりません。 –

答えて

1

を有するので、両方CavTestNpBaseTestクラスは抽象基底クラスであります仮想継承では、同じ仮想基本クラスから派生した複数の基本クラスを持つことができます。

仮想基本クラスのサブオブジェクトは、1回だけ初期化する必要があります。したがって、派生クラスはそれを明示的に初期化する必要があります。

ベースクラスが仮想ベースクラスサブオブジェクトと同じを初期化する場合、それらは複数回初期化されます。

+0

それで 'CavTest(uint16_t p_testId):NpBaseTest {p_testId、MODULE_CAV_TEST} {}'はどうですか?これは、子クラスでこれをやり直さなければならないときに、 'MODULE_CAV_TEST'で渡す無駄な宣言のようです。私は 'CavTest'の暗黙的なコンストラクタを使うことで逃げることができますか? – nitimalh

+0

@nitimalh 'CavTest'は複数の' CavTest'基底クラスのサブオブジェクトとそれらの間で共有されるただ1つの 'NpBaseTest'が存在する可能性があるため、' NpBaseTest'が既に初期化されているかどうかを知りません。 –

+0

ああ、私は理解していて、それを理解しました。私はCavTestコンストラクタでMODULE_CAV_TESTを渡す必要はありません。私はちょうどそれを 'CavTest(uint16_t p_testId):NpBaseTest {p_testId、0} {}'として宣言することができます。 – nitimalh

関連する問題