2014-09-30 2 views
0

Я не могу заставить метод переопределять работу. Сейчас у меня есть класс под названием Sprite и два подкласса; Назовем их Goomba и Koopa. Экземпляры Koopas и Goombas хранятся в std :: списке спрайтов, называемых spriteList, и итератор проходит через этот список и вызывает каждую функцию behh().Как переопределить в C++?

Я могу заставить это работать с одним только Goombas, определяя функцию поведения как Sprite :: behave(). Но если я попытаюсь сделать то же самое с Koopas, компилятор рассердится, потому что Sprite :: behave() уже определен в 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

Для объявлений функций вам нужно использовать ключевое слово 'virtual'. –

ответ

1

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

virtual void behave(); 

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

virtual void behave() override; 

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

+0

Кроме того, 'virtual' является избыточным, как только вы объявляете его как' override'. –

0

В 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(){ 
    ... 
} 
Смежные вопросы