【问题标题】:No Matching Function Call to Base class没有对基类的匹配函数调用
【发布时间】:2016-01-31 04:49:48
【问题描述】:

在这里,我试图创建基类 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;
    }

【问题讨论】:

    标签: c++ inheritance subclass


    【解决方案1】:
    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的可用构造函数。

    查看您发布的代码,选项 2 将起作用。

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

    清理建议

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

    【讨论】:

    • 我把它们弄糊涂了,我明白为什么现在不需要它们了!感谢您的帮助和额外提示!
    【解决方案2】:

    当这个构造函数被调用时

    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】:

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

      Fighter(int, int, string);
      

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

      Airplane::Airplane(int engine, int seat)

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

      你是否需要定义一个默认构造函数:

      Airplane::Airplane()
      

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-08
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-06
          • 1970-01-01
          相关资源
          最近更新 更多