繁体   English   中英

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

[英]C++: Create abstract class with abstract method and override the method in a subclass

如何在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<GameObject> objects = new ArrayList<GameObject>();
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<GameObject> 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的虚拟方法自动赋值给你的类是抽象的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM