c++ - C++中二维数组中的对象切片

标签 c++ arrays inheritance types object-slicing

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

例如有下面的基类和派生类:

class Base{

}

class Derived: public Base{

}

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

Base objectB;

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

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

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

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

Base *baseArray[5][5];

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

baseArray[x][y] = derivedPointer;

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

非常感谢任何帮助,

谢谢!

最佳答案

video game with different types of players that are able to move different based on there type but they all have certain base functionality that are the same.

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

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

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

根本不需要沮丧。游戏引擎可以编写成不需要关心它处理的是哪种派生类——只要派生对象符合接口(interface)即可。游戏引擎调用虚拟方法,这将导致调用适当的派生对象方法。

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

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

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

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

相关文章:

python - 我如何在python中将相同的列表对象分配给两个不同的变量名?

c++ - find_if 不适用于 const_iterator

c++ - 似乎无法让我的结构数组正确排序?

java - 使用方法填充二维数组时如何修复Array Errors和ArrayStoreException

ios - Obj C - 从类对象数组访问自定义类属性

inheritance - 如何获取自定义字段类型中的当前字段名称

c++ - 如何使编辑控件具有 3D 外观?

c++ - SDL程序启动后立即退出。我做错了什么?

php - 对多维数组进行两次排序

c++ - 我可以防止某些函数在 C++ 中被继承吗?