我正在尝试实现调用基类构造函数和继承的概念。我编写了以下代码,但是当我没有声明类A的默认构造函数时它给出错误,我想知道为什么我得到错误
#include <iostream>
using namespace std;
class A
{
int a;
public:
A() {} //Default Constructor
A(int x)
{
a=x;cout<<a;
cout<<"A Constructor\n";
}
};
class B: virtual public A
{
int b;
public:
B(int x)
{
b=x;cout<<b;
cout<<"B Constructor\n";
}
};
class C: virtual public A
{
int c;
public:
C(int x)
{
c=x;cout<<c;
cout<<"C Constructor\n";
}
};
class D: public B,public C
{
int d;
public:
D(int p,int q,int r,int s):A(p),B(q),C(r)
{
d=s;cout<<d;
cout<<"D Constructor\n";
}
};
int main()
{
D d(1,2,3,4);
return 0;
}
答案 0 :(得分:2)
如果你不调用子类中超类的构造函数,那么超类必须有一个默认构造函数,因为如果你想创建一个B实例,就会自动创建一个超类的实例,这是不可能的如果没有默认构造函数。
答案 1 :(得分:1)
目前,让我们简化一些事情,忘记课程C
和D
的存在。
如果您将B
类型的对象构造为
B b(10);
它将使用B::B(int)
。在B::B(int)
的实现中,A
的{{1}}部分必须以某种方式进行初始化。你有:
B
相当于:
B(int x)
{
b=x;cout<<b;
cout<<"B Constructor\n";
}
由于B(int x) : A()
{
b=x;cout<<b;
cout<<"B Constructor\n";
}
没有默认构造函数,编译器会正确地将其报告为错误。
您可以使用以下方法解决此问题:
A
如果希望能够从B(int x) : A(0)
{
b=x;cout<<b;
cout<<"B Constructor\n";
}
的构造函数向A(int)
传递另一个值,则需要允许用户使用两个参数构造B
。
B