在c ++中用二维数组内的对象切片

时间:2014-03-10 22:52:15

标签: c++ arrays inheritance types object-slicing

您好我在基类型的二维数组中存储派生类型对象时遇到了一个小问题,而没有丢失存储在数组中的派生类型。

例如,有以下Base和Derived类:

class Base{

}

class Derived: public Base{

}

有一点我创建了如下所示的Base对象:

Base objectB;

然后我将上面的对象转换为Derived类的类型,如下所示:

Base *referencePointer = &objectB;
Derived *derivedPointer = static_cast<Derived*>(referencePointer);

此时一切正常(如果我打印出derivedPointer的类型,它的类型为Derived)。

现在我有一个Base类的2维数组,初始化如下:

Base *baseArray[5][5];

现在我将derivedPointer值输入到数组中,如下所示:

baseArray[x][y] = derivedPointer;

这是问题发生的地方,因为它存储在referencePointer中,但它变成了Base类型(对象切片),我不确定如何存储referencePointer值并将其类型保存在Base类型的数组中

非常感谢任何帮助,

谢谢!

2 个答案:

答案 0 :(得分:1)

  

具有不同类型的能够移动的玩家的视频游戏   根据类型不同但它们都有一定的基础   功能相同。

想象一下,'基本功能'是在基类中实现的。这些方法可以很容易地作为公共或受保护的方法用于任何派生类。从而消除了重复的代码。

现在假设基类提供了一个虚拟方法“void move(CoordinatesXYZ_t to,VelocityXYZ_t vel,AccelerationXYZ_t acc)”。

只需在派生类中添加具有相同签名的(虚拟)方法,每个派生对象都可以为游戏引擎的移动命令提供自己唯一的响应。游戏引擎不需要知道它是什么类型的派生对象,将调用正确的虚拟方法。

根本不需要向下倾斜。可以编写游戏引擎,这样它就不需要关心它正在处理什么类型的派生类 - 只要派生对象符合接口即可。游戏引擎调用虚方法,这将导致调用适当的派生对象方法。

对于基本指针的二维数组的每个成员,实际方法可以是唯一的。

实际的方法甚至可以什么都不做(即树可能不会移动。)

派生类不必提供移动方法,除非所需行为与基类的移动方法提供的行为不同。

答案 1 :(得分:0)

Derived *derivedPointer = static_cast<Derived*>(referencePointer);

这是一个错误,因为referencePointer实际上指向Base个对象。编译器不会神奇地将额外位添加到Base对象以将其转换为Derived对象。要避免此错误,请使用dynamic_cast代替static_cast。然后你就能发现失败。

注意,Base需要具有多态性才能工作,它必须至少有1个虚函数。

顺便说一句,这与切片无关。即使referencePointer指向Derived,也没关系:你有一个2-D指针数组,可以放入Base *,这可能指向{{1}的对象1}}类型。如果您有一个Derived的二维数组,那将是切片。