Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有匹配的基类函数调用_C++_Inheritance_Subclass - Fatal编程技术网

C++ 没有匹配的基类函数调用

C++ 没有匹配的基类函数调用,c++,inheritance,subclass,C++,Inheritance,Subclass,在这里,我试图创建基类的一个子类,飞机。在我的主代码中,我还没有尝试使用这两个构造函数,因为我只是想确保子类Fighter能够正常工作 它给我的确切错误是 no matching function for call to 'Airplane:Airplane()' 并说它与Fighter.cpp中的这行代码有关 Fighter::Fighter(int engi, int seat, string description) 战斗机.cpp #include "Fighter.h" Fight

在这里,我试图创建基类的一个子类,飞机。在我的主代码中,我还没有尝试使用这两个构造函数,因为我只是想确保子类Fighter能够正常工作

它给我的确切错误是

no matching function for call to 'Airplane:Airplane()'
并说它与Fighter.cpp中的这行代码有关

Fighter::Fighter(int engi, int seat, string description)
战斗机.cpp

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

using namespace std;
Airplane::Airplane(int engines, int seats)
    {
        numSeats = seats;
        numEngines = engines;
    }
战斗机.h

#include "Airplane.h"

using namespace std;

#ifndef FIGHTER_H_
#define FIGHTER_H_

class Fighter:public Airplane {
private:
    int fNumSeats;
    int fNumEngines;
    string rangeAndSpeedDesc;
}
飞机.cpp

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

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

Fighter::Fighter(int engines, int seats, string desc) : Airplane()
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}
基类对象使用默认构造函数初始化,除非在构造函数实现的初始化列表中使用另一个构造函数初始化基类

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

您需要:

  • 向飞机添加默认构造函数,或
  • 使用初始化列表中可用的
    飞机
    构造函数
  • 查看您发布的代码,选项2将起作用

    Fighter::Fighter(int engines, int seats, string desc) :
            Airplane(engines, seats), rangeSpeed(desc)
    {
    }
    
    清理建议

    #include "Fighter.h"
    Fighter::Fighter(int engin, int seat, string description)
    {
        fNumEngines = engi;
        fNumSeats = seat;
        rangeAndSpeedDesc = description;
    }
    
    #include "Airplane.h"
    
    using namespace std;
    Airplane::Airplane(int engines, int seats)
        {
            numSeats = seats;
            numEngines = engines;
        }
    

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

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

    Fighter(int, int, string);
    
    将调用构造基类。在您的实现中,您没有显式调用基类构造函数:

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

    并且您没有默认构造函数,那么编译器应该做什么呢?它抱怨道

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

    Airplane::Airplane()
    
    或调用战斗机构造函数中的现有构造函数:

    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
    飞机
    没有默认构造函数。它有一个带参数的构造函数

    Airplane(int, int);
    
    因此,您需要在构造函数的mem初始值设定项列表中显式调用构造函数
    Fighter

    比如说

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

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

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

    我是出于混淆才制作的,我现在明白为什么不需要它们了!谢谢你的帮助和额外的小费!