为什么输出显示错误

时间:2013-05-27 12:27:38

标签: c++

这是多重继承的菱形树问题的代码 根据我的说法,这段代码很酷,但它在编译时显示出一些错误 ..帮助我找出错误

#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;
}

2 个答案:

答案 0 :(得分: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提供默认构造函数。声明任何构造函数都会阻止编译器为您隐式生成一个。

答案 1 :(得分:3)

您需要为D提供默认构造,并在成员初始化列表中调用A:

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

或者您可以提供默认的A构造函数

A():x(0) {}