Mar*_*aux 18 c++ java inheritance abstract-class
如何在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);
}
Run Code Online (Sandbox Code Playgroud)
将此代码翻译为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
Run Code Online (Sandbox Code Playgroud)
使用此代码:
vector<GameObject> gameObjects;
for (int i = 0; i < gameObjects.size(); i++) {
GameObject go = (GameObject) gameObjects.at(i);
go.Update();
}
Run Code Online (Sandbox Code Playgroud)
Pét*_*rök 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)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
需要virtual在基类中声明成员函数.在Java中,成员函数默认是虚拟的; 它们不是C++.
class GameObject
{
public:
virtual void update() = 0;
virtual void paint(Graphics g) = 0;
}
Run Code Online (Sandbox Code Playgroud)
在virtual使一个成员函数虚拟; 在= 0使一个成员函数纯虚.此类也是抽象的,因为它至少有一个虚拟成员函数没有具体的最终覆盖.
然后在你的派生类中:
class Player : public GameObject
{
public:
void update() { } // overrides void GameObject::update()
void paint(Graphics g) { } // overrides void GameObject::paint(Graphics)
}
Run Code Online (Sandbox Code Playgroud)
如果成员函数在基类中声明为virtual,则它在任何派生类中都是自动虚拟的(virtual如果您愿意,可以在派生类中放入声明,但它是可选的).