2012-04-11 7 views
0

次の行では、クラスAはクラスBとCによって継承される基本クラスです。 クラスDはBとCの両方から継承します。さらに、DのコンストラクタはB、C、Aのコンストラクタを呼び出します BとCが仮想としてAを継承するとき、Aのコンストラクタを直接呼び出すことはできません(同じ世代への呼び出しは3世代を通して行われる必要があるため)。C++複数の継承コンストラクタを呼び出す

私はクラスBのオブジェクトを作成する場合、Aは事実上継承されているので、とにかくAのコンストラクタを呼び出す(初期化に使用する変数v1とv2を渡す)のはありますか?

class A { 
    int a1,a2; 
    A() { 
    } 

    A(int v1,v2) { 
     a1 = v1; 
     a2 = v2; 
    } 
}; 

class B:virtual public A { 
    int b1,b2; 
    B() { 
    } 

    B(int v1,v2) { 
     b1 = v1; 
     b2 = v2; 
    } 
}; 

class C:virtual public A { 
    int c1,c2; 
    C() { 
    } 

    C(int v1,v2) { 
     c1 = v1; 
     c2 = v2; 
    } 
}; 

class D:public B,public C { 
    int d1,d2; 
    D() { 
    } 

    D(int v1,v2):B(v1,v2),C(v1,v2),A(v1,v2) 
    { 
     d1 = v1; 
     d2 = v2; 
    } 
}; 

答えて

1

またAためBに初期化子を与えることを完全に罰金です。その仮想継承が意味するのは、に偶数以上の派生オブジェクトがある場合、仮想基底は最も派生したオブジェクトによって構築されます。しかし、Bのインスタンスのみを構築している場合、そのインスタンスは、最も派生したオブジェクトであるです。だから、このようにそれを書く:あなたはベース初期化子が無視されていることをBから派生したときに

class B : public virtual A 
{ 
public: 
    B() : A(1, 2) { } 
    // ... 
}; 

それだけです。

0

あなたができることは、クラスBとクラスCをAから(仮想のキーワードなしで)普通に継承することですが、クラスDをBとCから実質的に継承するようにします。これによりクラスBのオブジェクトを作成できますまたはC)クラスAコンストラクタの値を渡すことによって>

関連する問題