0

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

私の質問は、クラス 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;
   }
};
4

2 に答える 2

1

Bの初期化子を指定することもまったく問題ありませんA。仮想継承が意味するのは、さらに派生したオブジェクトがある場合、仮想ベースは最も派生したオブジェクトによって構築されるということだけです。しかし、 のインスタンスのみを構築している場合B、そのインスタンス最も派生したオブジェクトです。したがって、次のように記述してください。

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

ベース初期化子が無視されるのは、派生しBた場合のみです。

于 2012-04-11T09:28:52.837 に答える
0

できることは、クラス B と C を A から通常どおり (キーワード「virtual」なしで) 継承させることですが、クラス D を B と C から仮想的に継承させることです。これにより、クラス B (または C) のオブジェクトを作成することができますクラス A コンストラクターに値を渡す>

于 2012-04-11T09:30:17.857 に答える