Я не могу заставить метод переопределить работу. Прямо сейчас у меня есть класс под названием 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);
}
В Sprite
Вы должны объявить функцию как virtual
virtual void behave();
Затем в Goomba
Вы должны заявить, что вы собираетесь override
эта функция
virtual void behave() override;
Заметка: override
ключевое слово новое с C++11
В обоих 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(){
...
}