Как переопределить конструктор абстрактного класса в подклассе - PullRequest
1 голос
/ 11 апреля 2019

Я только что перешел с Java на C ++, и я действительно борюсь с тем, что когда-то было основными понятиями.Все, что я хочу сделать, это создать абстрактный класс под названием «Космический корабль», дать ему конструктор, который принимает 4 аргумента, а затем в подклассе под названием «Космический корабль» я хочу создать конструктор, который принимает 5 аргументов, но наследует «космический корабль».конструкторы первые 4 аргумента.Я искал повсюду и не могу найти именно то, что я ищу.Ниже мой код.Пожалуйста и спасибо всем, кто может мне помочь!

header

#ifndef SPACESHIP
#define SPACESHIP

#include "Enum.h"

class Spaceship{
    public:
    float health;
    float food;
    float cash;
    float misc;

public:
    Spaceship(float, float, float, float);

};

class AlienSpaceship: public Spaceship{
    OrganismType race;

    public:
        AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float){}
};

#endif

cpp

#include "Spaceship.h"

Spaceship::Spaceship(float health, float food, float cash, float misc){
    this->health = health;
    this->food = food;
    this->cash = cash;
    this->misc = misc;
}

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc){
    this->race = race;
}

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Вы, похоже, неправильно поняли, как работает список инициализатора конструктора.

Он используется в определении (т.е. реализации) конструктора, он не нужен для объявления вашего конструктора.

Фактически, ваше текущее объявление в классе AlienSpaceship фактически определяет (реализует) конструктор из-за окончания {}.

Так что для класса все, что вам нужно сделать, это

class AlienSpaceship: public Spaceship{
    ...
    public:
        AlienSpaceship(float, float, float, float, OrganismType);
};

В соответствующей заметке я предлагаю вам также использовать списки инициализатора для инициализации переменных-членов, тогда ваши конструкторы могут быть просто

Spaceship::Spaceship(float health, float food, float cash, float misc)
    : health(health), food(food), cash(cash), misc(misc)
{ /* Empty */ }

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race)
    : Spaceship(health, food, cash, misc), race(race)
{ /* Empty */ }

И, конечно, это можно сделать встроенным в самом определении класса:

class AlienSpaceship: public Spaceship{
    ...
    public:
        AlienSpaceship(float health, float food, float cash, float misc, OrganismType race)
            : Spaceship(health, food, cash, misc), race(race)
        { /* Empty */ }
};
0 голосов
/ 11 апреля 2019

У вас должно быть только одно определение каждого ученика, но у вас есть два

Первый (неявный в определении класса)

public:
AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float)
{}

и второй в исходном файле

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
{
    this->race = race;
}

Выберите один из них, либо поставьте

AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
{
    this->race = race;
}

в определение класса

либо объявите это в классе

class AlienSpaceship: public Spaceship{
OrganismType race;

public:
AlienSpaceship(float, float, float, float, OrganismType);

и определить в исходном файле

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
{
    this->race = race;
}

Кроме того, объявление, как это

AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float)

is incorrect too. Actually, it conatains a part of defenition.
0 голосов
/ 11 апреля 2019

AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float){}

должно быть просто:

AlienSpaceship(float, float, float, float, OrganismType);

в заголовке.Вы фактически создали в своем заголовке вторую реализацию ...

...