没有对 Base class 的匹配函数调用

No Matching Function Call to Base class

在这里,我正在尝试制作基地 class 的子class,飞机。在我的主要代码中,我还没有尝试使用任何一个构造函数,因为我只是想确保我可以让 subclass 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;
    }
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;
}

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

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

您需要:

  1. Airplane 添加默认构造函数,或
  2. 在初始化列表中使用 Airplane 的可用构造函数。

查看您发布的代码,选项 2 可行。

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

清理建议

我不明白为什么您需要 Fighter 中的成员 fNumEnginesfNumSeats。基地 class 已经有成员可以捕获该信息。我建议您删除它们。

错误包含您需要的信息。您还没有为 class Airplane 定义默认构造函数。当你在这个函数中构造子 class Fighter 时:

Fighter(int, int, string);

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

飞机::飞机(发动机,座椅)

而且你没有默认构造函数,那编译器该怎么办呢?它抱怨。

您将需要定义一个默认构造函数:

Airplane::Airplane()

或者在fighter的构造函数中调用已有的构造函数:

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

调用此构造函数时

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

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

Airplane(int, int);

所以你需要显式调用构造函数的内存初始化器列表中的构造函数Fighter

例如

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

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

确保如果您使用构造函数调用基 class,则构造函数的名称与基 class

的名称相同