2

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

例如,有以下 Base 和 Derived 类:

class Base{

}

class Derived: public Base{

}

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

Base objectB;

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

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

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

现在我有一个基类类型的二维数组,初始化如下:

Base *baseArray[5][5];

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

baseArray[x][y] = derivedPointer;

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

任何帮助深表感谢,

谢谢!

4

2 回答 2

1

具有不同类型玩家的视频游戏,它们能够根据类型移动不同,但它们都具有相同的某些基本功能。

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

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

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

根本不需要垂头丧气。可以编写游戏引擎,使其根本不需要关心它正在处理什么样的派生类——只要派生对象符合接口。游戏引擎调用一个虚拟方法,这将导致调用适当的派生对象方法。

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

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

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

于 2014-03-11T00:18:29.213 回答
0
Derived *derivedPointer = static_cast<Derived*>(referencePointer);

这是一个错误,因为referencePointer实际上指向一个Base对象。编译器不会神奇地在对象上附加额外的位以Base将其转换为Derived对象。为避免此错误,请使用dynamic_cast代替static_cast. 然后您将能够检测到故障。

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

顺便说一句,这与切片无关。即使referencePointer指向 aDerived也没关系:你有一个二维指针数组,可以放入 a Base *,它可能指向一个Derived类型的对象。如果您有一个Base.

于 2014-03-11T00:07:39.787 回答