Java C++;:使用抽象方法创建抽象类,并在子类中重写该方法 如何在C++中创建一个抽象类,其中有一些抽象方法要覆盖在子类中?.h文件的外观如何?是否有.cpp,如果有,应该是什么样子
在Java中,它将如下所示: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
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;
}