如何从基对象向下映射到子对象

How do you downcast from a base object to a child one

本文关键字:对象 映射      更新时间:2023-10-16
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
}