如何在C ++中覆盖?

时间:2014-09-30 16:21:56

标签: c++ code-structure

我无法让方法覆盖工作。现在我有一个名为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);
}

2 个答案:

答案 0 :(得分:1)

Sprite中,您必须将该函数声明为virtual

virtual void behave();

然后在Goomba中,您应该声明您将要override该功能

virtual void behave() override;

注意:从C++11开始,override关键字是新的

答案 1 :(得分:0)

Koopa.cppGoomba.cpp中,您定义的是Sprite::behave。这会导致两个定义,正如您的工具链所告诉您的那样。您希望分别在这些文件中定义Koopa::behaveGoomba::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(){
  ...
}