在调用基类构造函数时声明默认构造函数

时间:2017-10-23 17:12:29

标签: c++ virtual-inheritance

我正在尝试实现调用基类构造函数和继承的概念。我编写了以下代码,但是当我没有声明类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;
}

2 个答案:

答案 0 :(得分:2)

如果你不调用子类中超类的构造函数,那么超类必须有一个默认构造函数,因为如果你想创建一个B实例,就会自动创建一个超类的实例,这是不可能的如果没有默认构造函数。

答案 1 :(得分:1)

目前,让我们简化一些事情,忘记课程CD的存在。

如果您将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