如何在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();
}

#1楼 票数:24 已采纳

在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)
{
     // ...
}

#2楼 票数:7

成员函数需要在基类中声明为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放在派生类中的声明中,但它是可选的)。

#3楼 票数:4

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

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

}

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

  ask by Martijn Courteaux translate from so

未解决问题?本站智能推荐:

3回复

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

如何在C ++中创建一个抽象类,其中包含一些我想在子类中重写的抽象方法? .h文件应该怎么样? 是否有.cpp ,如果是这样,它应该怎么样? 在Java中它看起来像这样: 将此代码翻译为C ++对我来说已经足够了。 编辑: 我创建了代码但是当我尝试迭代对象时,我得到
4回复

如何创建抽象类的无名派生类的对象?

考虑以下Java程序: 在这里,我正在创建抽象类的无名子类的对象令人惊讶的是,不是抽象类的对象,因为不允许在Java中创建抽象类的对象。 什么是等效的C ++程序? 是否可以在C ++中做到这一点? 如果可以,怎么办?如果不能,为什么不允许?
2回复

重载抽象类中的抽象方法

我想要一个具有抽象方法的抽象类,比如abstract void compare() 。 但是它所带的参数应该根据不同子类中的不同实现而有所不同。 我想知道这样做的正确方法是什么? 我不能通过在抽象类本身中编写它的不同签名来重载它,因为如果我这样做,它的任何子类都需要实现所有版本,这不是我想要的。
2回复

在抽象方法的实现中无法返回抽象类的子类

我有一个抽象类的两个子类,每个子类都实现其父类的抽象方法。 我希望每种返回类型都有不同的返回类型,尽管这些返回类型又是不同抽象类的子类。 见下文: 显然,Java不允许我这样做,但是我对如何获得此功能一无所知。 有任何想法吗?
9回复

有一个没有抽象方法的抽象类有什么意义?

可以有一个实现所有方法的抽象类-里面没有抽象方法。 例如。: 与拥有与具体类相同的类相比,拥有这样的抽象类(如果有)有什么优势? 我能想到的是,当我将其声明为抽象时,它不会被实例化。 但是,我可以通过将其具体化并将其构造函数设为私有来达到相同的效果。 TIA。
1回复

抽象超类的抽象方法作为子类中的静态方法

我已经开发了一个自定义的通信协议。 在此协议中,每个数据包均由标头和有效载荷组成。 每个有效负载包含多个命令。 我想在每个Command(Command0,...,Command N)中实现一个静态的“ decode”方法,因为相同类型的所有命令都以相同的方式解码(它们具有相同的字段结
2回复

不是抽象的,也不会覆盖抽象方法 [重复]

这个问题在这里已经有了答案: 当我们重写一个方法时,我们应该使用方法签名中的所有参数吗? (4 个回答) 24
3回复

抽象类和纯方法C ++

我已经读过一本书Stephen Prata-“ C ++ Primer Plus VI Edition”,在抽象类中,我可以编写纯方法的定义。 我知道我可以编写例如void pure() = 0 ,然后可以在此类中定义该方法。 我认为= 0只是使该类抽象,如果我使另一个类继承自该类,则不必覆
4回复

了解抽象类和方法并正确覆盖它们

我有一个名为Answer的抽象类。 它必须是抽象的,因为假设有许多不同类型的答案,例如字符串答案,视频答案,音频答案等。 现在在StringAnswer中,我想覆盖这些方法。 getAnswer给我带来了问题,因为我正在尝试返回一个String,但是它期望得到答案。 从抽象的
1回复

如何让子类覆盖具有扩展类型的父抽象方法? [重复]

这个问题在这里已有答案: 在java中覆盖具有不同返回类型的方法? 7个答案 例如 然后像 在这种情况下,SomeClass中的getFoo()应该是实现接口SpecialFooType的FooType。 但是我不知道如何为此设置语法。