这是多重继承的菱形树问题的代码 根据我的说法,这段代码很酷,但它在编译时显示出一些错误 ..帮助我找出错误
#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;
}
答案 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) {}