【发布时间】:2019-06-05 16:38:41
【问题描述】:
所以我对 C++ 感到耳目一新,老实说,这已经有一段时间了。我制作了一个控制台乒乓球游戏作为一种复习任务,并获得了一些关于使用多态性为我的类派生自基本“GameObject”(它具有一些用于将对象绘制到屏幕上的基本方法)的输入。
其中一个输入是(我随后问过)是从基类派生时内存是如何工作的。因为我并没有真正做过很多高级 C++。
例如,假设我们有一个基类,现在它只有一个“draw”方法(顺便说一句,为什么我们需要为它说virtual?),因为所有其他派生对象实际上只共享一个公共方法,并且正在绘制:
class GameObject
{
public:
virtual void Draw( ) = 0;
};
例如,我们还有一个球类:
class Ball : public GameObject
我收到的输入是,在适当的游戏中,这些可能会保存在某种 GameObject 指针向量中。像这样的东西:std::vector<GameObject*> _gameObjects;
(所以是指向 GameObjects 的指针向量)(顺便说一句,我们为什么要在这里使用指针?为什么不只是纯 GameObjects?)。我们将使用以下内容实例化其中一个游戏对象:
_gameObjects.push_back( new Ball( -1, 1, boardWidth / 2, boardHeight / 2 ); );
(new 返回指向对象的指针正确吗?IIRC)。根据我的理解,如果我尝试做类似的事情:
Ball b;
GameObject g = b;
事情会变得一团糟(如下所示:What is object slicing?)
但是...当我执行new Ball( -1, 1, boardWidth / 2, boardHeight / 2 ); 时,我不是简单地自行创建派生对象,还是自动将其分配为游戏对象?我真的无法弄清楚为什么一个有效而一个无效。例如,它是否与通过 new 与仅通过 Ball ball 创建对象有关?
对不起,如果这个问题没有意义,我只是想了解这个对象切片是如何发生的。
【问题讨论】:
-
_gameObjects很好。指针或引用避免了对象切片。Gameobject g = b;不行。 -
^ ... 甚至更好地使用 智能指针 像
std::unique_ptr<GameObject>或std::shared_ptr<GameObject>来存储在容器中。 -
GameObject g甚至不会编译,因为GameObject包含一个“纯虚拟”方法(即需要由子类实现的方法)。所以你不能创建GameObject类型的对象。
标签: c++ object-slicing