0

これは、多重継承のダイヤモンド ツリー問題のコードであり、私によると、このコードはクールですが、コンパイル時にエラーが表示されます..エラーを把握するのに役立ちます

#include<iostream>
using namespace std;

class A  //A Diamond tree problem
{
  int x;
public:
  A(int i) { x = i; }
  void print() { cout << x; }
};

class B: virtual public A
{
public:
  B():A(10) {  }
};

class C:  virtual public A 
{
public:
  C():A(20) {  }
};

class D: public B, public C{
};

int main()
{
    D d;
    d.print();
    return 0;
}
4

2 に答える 2

8

エラーを確認すると便利です。

In constructor ‘D::D()’:
error: no matching function for call to ‘A::A()’

仮想継承を使用する場合、仮想基本クラスは最も派生したクラスによって初期化する必要があります。この場合、つまりD; したがって、インスタンス化できるようにするにDは、初期化する必要がありますA:

class D: public B, public C
{
public:
    D():A(42) {}
};

Aまたは、デフォルトのコンストラクターを提供することもできます。コンストラクターを宣言すると、コンパイラーが暗黙的にコンストラクターを生成するのを防ぎます。

于 2013-05-27T12:32:05.680 に答える
3

D のデフォルト コンストラクトを提供し、メンバー初期化リストで A を呼び出す必要があります。

class D: public B, public C{
public:
   D():A(30){}
};

または、デフォルトの A コンストラクターを提供できます

A():x(0) {}
于 2013-05-27T12:31:49.033 に答える