我在 C# 中有一个自定义类实体的数组。由于我创建了不同类型的实体以及 C# 多态性的工作方式,我选择将不同的实体类型保留在一个实体数组中(即,我在 Entity 数组中有 Player 实体、Enemy 实体等)。但是,在 C++ 中,使用实体向量,当我声明一个唯一实体(例如玩家)时,它似乎丢失了它作为玩家所具有的所有值,只保留它作为实体所具有的值。这是我的疏忽,还是 C++ 中的多态规则不同?我怎样才能解决这个问题?
2 回答
Object slicing in C++
Sometimes also called the slicing problem, occurs if a superclass instance is assigned its value from a subclass instance, member variables defined in the subclass cannot be copied, since the superclass has no place to store them. This only happens when you pass objects by value. As Kornel pointed out, a way around this is to use vectors of pointers to objects.
See the Wikipedia entry for a nice code example. Better yet this SO thread, explains in more details the subtle bugs that can be caused by accidental slicing
在 C# 中,默认情况下,一切都是对对象的“引用”。在 C++ 中,您需要使用向量中的指针 ( eg vector< Entity* >
) 或您选择的智能指针 ( unique_ptr
or shared_ptr
),以表明您是指实体本身,而不是值。
否则,为每个实体分配的空间是相同的,因此会丢失任何附加信息。