C++ Runtime class切换,依赖基class继承

C++ Runtime class switching, relying on base class inheritance

我并不完全精通 C++,而且我目前正在进行的项目遇到了一个小问题。我遇到过这个:http://www.terrainformatica.com/2010/08/cpp-how-to-change-class-of-object-in-runtime/ 但我不确定这是否是我正在寻找的解决方案,或者是否有更好的选择。

我的意图是切换存储在内存中的炮塔类型,尽管它们是基础 CTurret 的不同实例。并且尽可能减少对性能的影响,因为这将在一个简单的游戏中实现。

基本上我有一个基数 class CTurret 的基数 class CEntity。现在我有几个炮塔(基本、快速、无害)。每个炮塔都使用基础 class CTurret 我想保留一些内存来容纳通用炮塔,然后可以简单地将其换成实际的炮塔类型。更好的视觉效果如下:

class CEntity...
class CTurret : public CEntity...
class CBasicTurret : public CTurret...
class CFastTurret : public CTurret...

内存(5 个通用炮塔)
Array[CTurret, CTurret, CTurret, CTurret, CTurret] // 不能使用泛型!

用户想要一个基本的炮塔,填充一个可用的通用炮塔:
Array[CBasicTurret, CTurret, CTurret, CTurret, CTurret] // 啊,一个基本的炮塔我会用那个。

不再需要时:
Array[CTurret, CTurret, CTurret, CTurret, CTurret] // 回到原点。

到目前为止,我只能看到两个选项来实现我想要的:
1) 我可以将所有炮塔类型放在基本 class 中,然后将其从基础更改为...实际的 class。但这会很快变得混乱。
2) 我可以为每种炮塔类型保留内存,这不是理想的情况,因为内存很宝贵,不应该这样浪费。此外,用户可能会要求超过已经保留的数量,这可能会造成未来的问题。

您需要确定炮塔类型之间的区别。

一般的选择是多态基础 class(派生的 classes 覆盖继承的虚函数以专门化行为)或具有状态的单个 class(例如枚举类型描述操作模式,描述速度的浮点数等)。

如果您决定使用多态基数,则可以使用智能指针数组。只需选择要使用的指针(或数组的索引)即可。指针(和它们指向的对象)无论如何都会在内存中。

对于单个对象,只需根据需要更改其状态即可。因此,更改高度、宽度、操作模式等值。如果您真的担心内存使用情况,这是更好的选择(只需要内存中的一个对象,尽管没有什么能阻止您拥有一组对象,其中每个元素有不同的状态)。

您链接到的放置新技巧有一些已被掩盖的陷阱,以及将具有数据的对象变形为没有数据的对象的特定示例是有问题的(例如,导致调用者表现出未定义的行为).