C++:使用类型在变量中存储类的子代

1 c++ delphi oop inheritance

我目前正在开发2D游戏项目,我想从Delphi切换到C++.

在Delphi中,我可以声明一个具有类类型的数组Entity,并且我可以将Entitys以及派生自Entity它的类的对象放入其中.

这对我来说非常重要,因为在一个地方存储和管理所有实体似乎是合乎逻辑的.

  • 这在C++中是否可行?
  • (为什么不在Delphi?)

  • 我有什么其他选择来实现类似的东西?

我需要做以下的事情:

#include <vector>
using namespace std;

class Entity
{
public:
 int id;
};

class Camera : Entity
{
public:
 int speed;
};

int main()
{
 Entity point;
 Camera camera;

 vector<Entity> vec;

 vec.push_back( point );
 vec.push_back( camera ); //Why can't I do that?
}
Run Code Online (Sandbox Code Playgroud)

我希望自己足够清楚,我真的很感激你的帮助

小智 5

使用boost :: ptr_vector <Entity>来存储多态对象,或智能指针的容器,例如vector <boost :: shared_ptr <Entity >>,如果你需要在别处共享/移动它们.


Pau*_*lik 5

...因为(没有进一步的修饰符)所有C++类型都是值类型,用Delphi或C#来表达.你基本上是这样做的:

 point = camera;
Run Code Online (Sandbox Code Playgroud)

该语句调用编译器生成的赋值运算符:

Entity& Entity::operator(const Entity& pOther) ...
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为const Camera&可转换为const Entity&.但是在赋值中,没有关于Camera对象部分的信息,pOther将'切片'转化为Entity对象.通过告诉C++编译器您希望将对象视为引用类型(指针)来获得所需的行为:

int main() 
{ 
 vector<std::shared_ptr<Entity> > vec; 

 vec.push_back( std::shared_ptr<Entity>(new Point) ); 
 vec.push_back( std::shared_ptr<Entity>(new Camera) );
}
Run Code Online (Sandbox Code Playgroud)