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 回答