C ++:使用抽象方法创建抽象类并覆盖子类中的方法

如何在C ++中创建一个抽象类,其中包含一些我想在子类中重写的抽象方法? .h文件应该怎么样? 是否有.cpp ,如果是这样,它应该怎么样?

在Java中,它看起来像这样:

 abstract class GameObject { public abstract void update(); public abstract void paint(Graphics g); } class Player extends GameObject { @Override public void update() { // ... } @Override public void paint(Graphics g) { // ... } } // In my game loop: List objects = new ArrayList(); for (int i = 0; i < objects.size(); i++) { objects.get(i).update(); } for (int i = 0; i < objects.size(); i++) { objects.get(i).paint(g); } 

将此代码转换为C ++对我来说已经足够了。

编辑:

我创建了代码,但是当我尝试迭代对象时,我得到以下错误:

 Game.cpp:17: error: cannot allocate an object of abstract type 'GameObject' GameObject.h:13: note: because the following virtual functions are pure within 'GameObject': GameObject.h:18: note: virtual void GameObject::Update() GameObject.h:19: note: virtual void GameObject::Render(SDL_Surface*) Game.cpp:17: error: cannot allocate an object of abstract type 'GameObject' GameObject.h:13: note: since type 'GameObject' has pure virtual functions Game.cpp:17: error: cannot declare variable 'go' to be of abstract type 'GameObject' GameObject.h:13: note: since type 'GameObject' has pure virtual functions 

使用此代码:

 vector gameObjects; for (int i = 0; i < gameObjects.size(); i++) { GameObject go = (GameObject) gameObjects.at(i); go.Update(); } 

在Java中,默认情况下所有方法都是virtual的,除非您将它们声明为final 。 在C ++中,它是另一种方式:您需要显式声明您的方法是virtual 。 要使它们成为纯虚拟,你需要将它们“初始化”为0 :-)如果你的类中有一个纯虚方法,它会自动变成抽象的 – 它没有明确的关键字。

在C ++中,你应该(几乎)总是为你的基类virtual定义析构函数,以避免棘手的资源泄漏。 所以我在下面的例子中添加了:

 // GameObject.h class GameObject { public: virtual void update() = 0; virtual void paint(Graphics g) = 0; virtual ~GameObject() {} } // Player.h #include "GameObject.h" class Player: public GameObject { public: void update(); void paint(Graphics g); } // Player.cpp #include "Player.h" void Player::update() { // ... } void Player::paint(Graphics g) { // ... } 

成员函数需要在基类中声明为virtual 。 在Java中,默认情况下成员函数是虚拟的; 它们不是C ++。

 class GameObject { public: virtual void update() = 0; virtual void paint(Graphics g) = 0; } 

virtual使成员函数虚拟化; = 0使成员函数纯虚拟。 此类也是抽象的,因为它至少有一个虚拟成员函数没有具体的最终覆盖。

然后在你的派生类中:

 class Player : public GameObject { public: void update() { } // overrides void GameObject::update() void paint(Graphics g) { } // overrides void GameObject::paint(Graphics) } 

如果成员函数在基类中声明为虚拟,则它在任何派生类中都是自动虚拟的(如果您愿意,可以将virtual放在派生类中的声明中,但它是可选的)。

在C ++中,您在例程中使用关键字virtual,并指定=0; 进入他们。 像这样:

 class GameObject { public: virtual void update()=0; virtual void paint(Graphics g)=0; } 

将一个带有0的虚拟方法自动赋值给你的类是抽象的。