No Matching Function Call to Base class

大兔子大兔子 提交于 2019-11-30 23:18:18
Fighter::Fighter(int engines, int seats, string desc)
{
    fNumEngines = engines;
    fNumSeats = seats;
    rangeSpeed = desc;
}

is equivalent to:

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

The base class object is initialized using the default constructor unless another constructor is used to initialize the base class in the initialization list in the constructor implementation.

That's why the compiler cannot compile that function.

You need to:

  1. Add a default constructor to Airplane, or
  2. Use the available constructor of Airplane in the the initialization list.

Looking at your posted code, option 2 is going to work.

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

Suggestion for cleanup

I don't see why you need the members fNumEngines and fNumSeats in Fighter. The base class already has the members to capture that information. I suggest that you should remove them.

The error contains the information that you need. You havent defined a default constructor for class Airplane. When you construct the child class Fighter in this function:

Fighter(int, int, string);

There will be a call to construct the base class. In your implementation you do not explicitly call the base class constructor:

Airplane::Airplane(int engines, int seats)

And you have no default constructor, so what should the compiler do? It complains.

You wiether need to define a default constructor:

Airplane::Airplane()

Or call an existing constructor in the constructor for fighter:

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

When this constructor is called

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

then it calls the default base class constructor. However class Airplane does not have the default constructor. It has a constructor with parameters

Airplane(int, int);

So you need explicitly calll the constructor in the mem-initializer list of the constructor Fighter

For example

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

Also it is not clear why the data members of the base class and the derived class are duplicated.

Make sure that if you are calling a base class with a constructor, the name of the constructor is the the same as that of the base class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!