【发布时间】:2014-04-14 07:37:35
【问题描述】:
您好,我在将派生类型对象存储在基本类型的二维数组中时遇到了一个小问题,而不会丢失存储在数组中的派生类型。
例如有以下 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 类型的数组中.
非常感谢任何帮助,
谢谢!
【问题讨论】:
-
我想在一个数组中输入多个派生类,因为不同的对象将具有不同的功能。想象一下,有一个视频游戏,有不同类型的玩家,他们可以根据不同的类型进行不同的移动,但它们都具有相同的某些基本功能。
-
objectB是基本类型,但您将其强制转换为派生类型(相关的类型但不是类型objectB实际上是)。这是未定义的行为,不会像您期望的那样工作。也没有进行对象切片,因为您使用的是指针而不是对象值。 -
@CaptainObvlious 我对对象切片概念有点陌生,我认为这就是这里发生的事情,但我可能错了。演员阵容似乎有效?我使用 typeid(derivedPointer).name() 打印出来,它打印出 Derived 类型的类型,这意味着强制转换工作但是当我在输入后打印出以下 typeid(baseArray[x][y]).name() derivedPointer 它打印出 Base 类型的类型。
-
未定义的行为意味着任何事情都可能发生,包括代码完全按预期工作。在另一个平台上构建它并运行它,结果可能会非常令人震惊。添加一些成员变量或虚函数,您的代码可能会以非常惊人的方式失败。
-
@Baraa,实际上,您的
typeid()sn-ps 正在识别指针的类型,而不是指向对象的类型。
标签: c++ arrays inheritance types object-slicing