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

例如,存在以下基类和派生类:

class Base{

}

class Derived: public Base{

}

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

然后,将上述对象转换为Derived类的类型,如下所示:
Base *referencePointer = &objectB;
Derived *derivedPointer = static_cast<Derived*>(referencePointer);

在这一点上,一切都正常工作(如果我打印出派生指针的类型,则它是派生类型的)。

现在,我有一个基类类型为二维的数组,其初始化如下:
Base *baseArray[5][5];

现在,我将派生指针值输入到数组中,如下所示:
baseArray[x][y] = derivedPointer;

这是问题所在,因为它存储在referencePointer中,但是变成了Base类型(对象 slice ),我不确定如何处理referencePointer值并将其类型保存在Base类型的数组中。

任何帮助深表感谢,

谢谢!

最佳答案



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

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

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

完全不需要向下转换。可以编写游戏引擎,以便它根本不需要关心它正在处理哪种派生类-只要派生对象符合接口(interface)即可。游戏引擎调用虚拟方法,这将导致调用适当的派生对象方法。

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

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

除非期望的行为与基类的move方法提供的行为不同,否则派生类不必提供move方法。

关于c++ - C++中二维数组中的对象切片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22313068/

10-11 22:35
查看更多