我无法让方法覆盖工作。现在我有一个名为Sprite的类,还有两个子类;我们称之为Goomba和Koopa。 Koopas和Goombas的实例存储在名为spriteList的std ::精灵列表中,迭代器遍历此列表并调用每个sprite的behave()函数。
通过将行为函数定义为Sprite :: behave(),我可以单独使用Goombas。但是如果我尝试用Koopas做同样的事情,编译器就会生气,因为在Goomba中已经定义了Sprite :: behave()。我究竟做错了什么?我觉得答案是一个非常简单的语法问题,但在线查看并没有看到与我的代码非常相似的示例。
我会粘贴一些代码,希望它会有所帮助。这不是我的确切源代码,所以我为任何拼写错误道歉。
//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 :(得分:1)
在Sprite
中,您必须将该函数声明为virtual
virtual void behave();
然后在Goomba
中,您应该声明您将要override
该功能
virtual void behave() override;
注意:从C++11
开始,override
关键字是新的
答案 1 :(得分: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(){
...
}