структура кода — Как мне переопределить в C ++?

Я не могу заставить метод переопределить работу. Прямо сейчас у меня есть класс под названием Sprite и два подкласса; Давайте назовем их Гумба и Купа. Экземпляры Koopas и Goombas хранятся в std :: списке спрайтов, называемом spriteList, и итератор проходит по этому списку и вызывает функцию поведение () каждого спрайта.

Я могу заставить это работать только с Гумбасом, определив функцию поведения как Sprite :: поведение (). Но если я попытаюсь сделать то же самое с Koopas, компилятор рассердится, потому что Sprite :: поведение () уже определено в Goomba. Что я делаю неправильно? У меня такое ощущение, что ответ — это очень простая синтаксическая проблема, но при поиске в Интернете не было примеров, похожих на мой код.

Я вставлю код, надеюсь, это поможет. Это не мой точный исходный код, поэтому я прошу прощения за любые опечатки.

//Sprite.h:
#ifndef SPRITE_H
#define SPRITE_H

class Sprite {
private:
float xPosition; float yPosition;
public:
Sprite(float xp, float yp);
void move(float x, float y); //this one is defined in Sprite.cpp
void behave(); //this one is NOT defined in Sprite.cpp
};
#endif//Goomba.h:
#ifndef GOOMBA_H
#define GOOMBA_H
#include "Sprite.h"
class Goomba : public Sprite {
public:
Goomba(float xp, float yp);
void behave();
};
#endif//Goomba.cpp:
#include "Goomba.h"
Goomba::Goomba(float xp, float yp): Enemy(xp, yp) {}
void Sprite::behave(){
Sprite::move(1, 0);
}//Koopa.h looks just like Goomba.h//Koopa.cpp
#include "Koopa.h"
Koopa::Koopa(float xp, float yp): Enemy(xp, yp) {}
void Sprite::behave(){
Sprite::move(-2, 1);
}

0

Решение

В Sprite Вы должны объявить функцию как virtual

virtual void behave();

Затем в Goomba Вы должны заявить, что вы собираетесь override эта функция

virtual void behave() override;

Заметка: override ключевое слово новое с C++11

1

Другие решения

В обоих Koopa.cpp а также Goomba.cpp вы определяете Sprite::behave, Это приводит к двум определениям, как сказал вам ваш набор инструментов. Вы хотите определить Koopa::behave а также Goomba::behaveсоответственно в этих файлах.

Вы также хотите определить Sprite::behave в Sprite.cpp (Вы сказали, что в настоящее время нигде не определяете это).

Вы также хотите сделать Sprite::behave виртуальная функция для того, чтобы получить полиморфное поведение после того, как вы работаете так, как вы ожидаете:

class Sprite {
// ...
// You can either define Sprite::behave in Sprite.cpp or change the declaration to:
// virtual void behave() = 0;
// to make it "pure virtual," indicating that subclasses must provide an implementation.
virtual void behave();
};

В Goomba.cpp, например:

#include "Goomba.h"
Goomba::Goomba(float xp, float yp): Enemy(xp, yp) {}
void Goomba::behave(){
...
}
0