如何从基对象向下映射到子对象
How do you downcast from a base object to a child one
struct BaseObject
{};
struct HardMonster : BaseObject
{
int Berserk(int);
private:
std::list<BaseObject> MonsterList;
};
我把所有的怪物都定义为一个BaseObject,所以更容易制作它们的列表。但是当我需要将BaseObject转换为HardMonster以便使用Berserk函数时。我知道,我可以做的很简单,只是做一个临时硬怪来计算狂暴的伤害。但是我想用正确的方法。
如果使用:
list<BaseObject> MonsterList; //This is where the Object list is defined.
将只存储BaseObject
s。如果将任何派生类型的对象添加到列表中,则将失去存储对象中的派生类型部分。
深入阅读:什么是对象切片?
你需要存储的是指向BaseObject
s的指针,最好是智能指针。
std::list<std::shared_ptr<BaseObject>> MonsterList;
从一个std::shared_ptr<BaseObject>
,你可以用dynamic_pointer_cast
得到一个std::shared_ptr<HardMonster>
。
std::shared_ptr<BaseObject> baseObject;
std::shared_ptr<HardMonster> monster = std::dynamic_pointer_cast<HardMonster>(baseObject);
if ( monster )
{
// The cast is successful...
// Use monster
}
相关文章:
- 使用std::函数映射对象方法
- 使用"std::unordereded_map"映射到"std::list"对象
- 在c++中访问int到类对象的映射时出错
- 如何创建对象函数指针C++映射?
- 准确了解对象在内存中的映射方式
- 将包含不可复制对象的对插入到映射中
- 添加要映射的对象的唯一指针
- 打印对象的映射,其中另一个对象作为键
- 单行初始化映射中的C++对象
- 将大型对象存储在无序映射中是否效率低下
- 具有不同参数列表的模板对象的模板静态映射
- 当覆盖映射中的复杂对象键时,旧对象将被删除(C++)
- C++-将对象(如字符串)映射到表中成员函数的正确方法
- 您可以将C 对象映射到内存映射的外围设备吗?
- std::对象映射或对象指针
- 指针映射或堆栈对象映射
- 为什么c++对象映射在Mavericks和Mountain Lion上不同?
- 使用预先填充的对象映射实现工厂模式
- C++XML到C++对象映射库
- c++类构造函数自动将对象映射到事件处理程序