无匹配函数调用基类

时间:2015-10-30 17:14:43

标签: c++ inheritance subclass

这里我试图创建一个基类的子类,Airplane。在我的主要代码中,我还没有尝试使用任何构造函数,因为我只是想确保我可以使子类Fighter正常工作。

它给我的确切错误是

no matching function for call to 'Airplane:Airplane()'

并说这与Fighter.cpp中的这行代码有关。

Fighter::Fighter(int engi, int seat, string description)

Fighter.cpp

#include "Fighter.h"
Fighter::Fighter(int engin, int seat, string description)
{
    fNumEngines = engi;
    fNumSeats = seat;
    rangeAndSpeedDesc = description;
}

Fighter.h

#include "Airplane.h"

using namespace std;

#ifndef FIGHTER_H_
#define FIGHTER_H_

class Fighter:public Airplane {
private:
    int fNumSeats;
    int fNumEngines;
    string rangeAndSpeedDesc;
}

Airplane.cpp

#include "Airplane.h"

using namespace std;
Airplane::Airplane(int engines, int seats)
    {
        numSeats = seats;
        numEngines = engines;
    }

4 个答案:

答案 0 :(得分:8)

Fighter::Fighter(int engines, int seats, string desc)
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}

相当于:

Fighter::Fighter(int engines, int seats, string desc) : Airplane()
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}

使用默认构造函数初始化基类对象,除非在构造函数实现的初始化列表中使用另一个构造函数初始化基类。

这就是编译器无法编译该函数的原因。

你需要:

  1. 将默认构造函数添加到Airplane
  2. 在初始化列表中使用Airplane的可用构造函数。
  3. 查看您发布的代码,选项2即可运行。

    Fighter::Fighter(int engines, int seats, string desc) :
            Airplane(engines, seats), rangeSpeed(desc)
    {
    }
    

    建议清理

    我不明白为什么您需要fNumEngines中的成员fNumSeatsFighter。基类已经有成员捕获该信息。我建议您删除它们。

答案 1 :(得分:0)

错误包含您需要的信息。您尚未为类Airplane定义默认构造函数。在此函数中构造子类Fighter时:

Fighter(int, int, string);

将调用构造基类。在您的实现中,您没有显式调用基类构造函数:

飞机::飞机(int引擎,int座位)

你没有默认构造函数,那么编译器应该怎么做?它抱怨道。

您还需要定义默认构造函数:

Airplane::Airplane()

或者在战斗机的构造函数中调用现有的构造函数:

Fighter::Fighter(int engines, int seats, string desc) : Airplane(engines, seats)

答案 2 :(得分:0)

调用此构造函数时

Fighter::Fighter(int engines, int seats, string desc)
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}

然后它调用默认的基类构造函数。但是,类Airplane没有默认构造函数。它有一个带参数的构造函数

Airplane(int, int);

所以你需要在构造函数Fighter的mem-initializer列表中显式地调用构造函数

例如

Fighter::Fighter(int engines, int seats, string desc) : Airplane( engines, seats )
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}

还不清楚为什么基类的数据成员和派生类是重复的。

答案 3 :(得分:0)

请确保如果您要使用构造函数调用基类,则构造函数的名称应与基类的名称相同