仮想継承では、仮想基本クラスは最終派生クラスによって初期化されます。つまり、最終派生クラスのコンストラクターは仮想基本クラスのコンストラクターを呼び出す必要があります。究極の派生クラスの場合、仮想基本クラスは直接基本クラスではなく間接基本クラスです。通常の継承とは異なり、派生クラスのコンストラクタ内で呼び出せるのは直接基底クラスのコンストラクタのみであり、間接基底クラスは呼び出せません。
コンストラクターの呼び出しを示すために、ダイヤモンドの継承を例に挙げてみましょう。
#include <iostream>
using namespace std;
//虚基类A
class A{
public:
A(int a);
protected:
int m_a;
};
A::A(int a): m_a(a){ }
//直接派生类B
class B: virtual public A{
public:
B(int a, int b);
public:
void display();
protected:
int m_b;
};
B::B(int a, int b): A(a), m_b(b){ }
void B::display(){
cout<<"m_a="<<m_a<<", m_b="<<m_b<<endl;
}
//直接派生类C
class C: virtual public A{
public:
C(int a, int c);
public: