Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C++;:使用抽象方法创建抽象类,并在子类中重写该方法 如何在C++中创建一个抽象类,其中有一些抽象方法要覆盖在子类中?.h文件的外观如何?是否有.cpp,如果有,应该是什么样子_Java_C++_Inheritance_Abstract Class - Fatal编程技术网

Java C++;:使用抽象方法创建抽象类,并在子类中重写该方法 如何在C++中创建一个抽象类,其中有一些抽象方法要覆盖在子类中?.h文件的外观如何?是否有.cpp,如果有,应该是什么样子

Java C++;:使用抽象方法创建抽象类,并在子类中重写该方法 如何在C++中创建一个抽象类,其中有一些抽象方法要覆盖在子类中?.h文件的外观如何?是否有.cpp,如果有,应该是什么样子,java,c++,inheritance,abstract-class,Java,C++,Inheritance,Abstract Class,在Java中,它将如下所示: abstract class GameObject { public abstract void update(); public abstract void paint(Graphics g); } class Player extends GameObject { @Override public void update() { // ... } @Override publi

在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);
}
使用此代码:

vector<GameObject> gameObjects;

for (int i = 0; i < gameObjects.size(); i++) {
    GameObject go = (GameObject) gameObjects.at(i);
    go.Update();
}
矢量游戏对象;
对于(int i=0;i
需要在基类中声明成员函数
virtual
。在Java中,成员函数默认为虚拟函数;它们不是C++的。
class GameObject
{
public:
    virtual void update() = 0;
    virtual void paint(Graphics g) = 0;
}
virtual
使成员函数虚拟;
=0
使成员函数成为纯虚拟函数。此类也是抽象的,因为它至少有一个虚拟成员函数没有具体的最终重写器

然后在派生类中:


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

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

<>在C++中,你应该(几乎)总是定义基类的析构函数<代码>虚拟< /C> >,以避免棘手的资源泄漏。因此,我在下面的示例中添加了:

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

C++中,在例程上使用关键字Virtual,并赋值<代码>=0;<将>编码到它们中。像这样:

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

}

拥有一个分配了
0
的虚拟方法会自动使类变得抽象。

我可以调用
update()对于GameObjects向量中的每个元素?不。你需要GameObject*向量或类似shared_ptr或auto_ptr的相关类。是的,但这意味着
GameObject
是抽象的。你的“我的游戏循环”代码是。。。充其量是不完整的。什么是
对象
?如果你还没有一个,我强烈建议从萨特那里得到一本初学者的书。你也可以参考草本的《Martijn》的文章,它讨论了在C++中使用虚拟函数和继承的许多最佳实践。@ Martijn,你不能有一个<代码>矢量< /代码>,因为它将按值存储元素,但是<代码>游戏对象< /代码>由于是抽象的,所以不能有实例。您需要一个
向量
,或者最好是一个
向量
来存储多态对象。另请参阅James McNellis答案的注释。如果已经声明了方法,为什么需要在GameObject.h中声明方法?
// 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)
{
     // ...
}
class GameObject {
public:
    virtual void update()=0;
    virtual void paint(Graphics g)=0; 

}