获取错误没有与AirShip AirShip呼叫匹配的功能

时间:2017-04-13 20:52:59

标签: c++ inheritance constructor

我试图解决此错误,但我不知道该怎么做..

#include<iostream>
#include<string>
using namespace std;
class AirShip{
private:
    int passenger;
    double cargo;
public:
    AirShip(int x,double y)
    {
        passenger=x;
        cargo=y;
    }

    void show ()
    {
        cout<<"passenger="<<passenger<<endl;
        cout<<"cargo="<<passenger<<endl;
    }
};
class AirPlane: protected AirShip{
private:
    string engine;
    double range;
public:
    AirPlane(string a,double b)
    {
        engine=a;
        range=b;
    }
void show()
{
    cout<<"engine="<<engine<<endl;
    cout<<"range="<<range<<endl;
}
};

错误是: 错误:没有用于呼叫AirShip :: AirShip()&#39;的匹配功能 需要帮助... 我稍后会把主要功能放进去,因为错误就在这里。

2 个答案:

答案 0 :(得分:3)

当您创建AirPlane时,您也隐式地创建了AirShip部分。您可以像这样编写构造函数:

AirPlane(string a,double b) : AirShip()
{
    engine=a;
    range=b;
}

但是,AirShip没有默认构造函数。你基本上有两个选择:

A)提供默认构造函数。默认构造函数是可以不带参数调用的构造函数。例如,您可以为乘客和货物的数量提供默认参数。但是,我不建议这样做。 Imho最好正确地初始化构造函数中的所有成员,并且默认值不是您想要的大部分时间。

B)正确初始化AirShip的{​​{1}}部分,例如......

AirPlane

...并为其他成员使用初始化列表。

答案 1 :(得分:0)

由于你的AirPlane - 类派生自AirShip,它还需要通过显式调用的AirShip - 构造函数或通过(甚至隐式)调用来初始化基类。 AirShip - 默认构造函数。

但是,您的AirShip类不提供默认构造函数(可以隐式调用),而您的AirPlane(string a,double b) { ... } - 构造函数不会显式调用任何其他AirShip - 构造函数。

因此要么在AirShip定义默认构造函数,要么引入基类的显式初始化,例如:写AirPlane(string a,double b) : AirShip(0,0) {...}