c#到c++的多态性

本文关键字:多态性 c++ | 更新日期: 2023-09-27 18:16:03

我在c#中有一个自定义类Entity的数组。由于我创建了不同类型的实体以及c#多态性的工作方式,我选择将不同的实体类型保留在一个实体数组中(即我在实体数组中拥有玩家实体,敌人实体等)。然而,在c++中,使用实体的向量,当我声明一个唯一的实体,如玩家,它似乎失去了所有的值,它作为一个玩家,只维持那些它作为一个实体。这是我的疏忽,还是c++中的多态性规则不同?我该如何解决这个问题?

c#到c++的多态性

c++中的对象切片

有时也称为切片问题,如果超类实例从子类实例中分配了,则无法复制子类中定义的成员变量,因为超类没有地方存储它们。这只发生在按值传递对象时。正如Kornel指出的那样,解决这个问题的一种方法是使用指向对象的指针的向量。

参见Wikipedia条目中的一个很好的代码示例。更好的是,这个SO线程更详细地解释了意外切片

可能引起的微妙错误。

在c#中,默认情况下所有东西都是对象的"引用"。在c++中,你需要在向量中使用指针(例如vector< Entity* >)或你选择的智能指针(unique_ptrshared_ptr),以表明你是通过实体本身引用实体,而不是通过值。

否则,为每个实体分配的空间是相同的,因此会丢失任何额外的信息。