struct BaseObject
{};
struct HardMonster : BaseObject
{
int Berserk(int);
private:
std::list<BaseObject> MonsterList;
};
我将所有怪物都定义为BaseObject,因此列出它们比较容易。但是当我需要将BaseObject转换为HardMonster时,可以使用Berserk函数。我知道,我可以轻松做到这一点,只需制作一个临时的Hardmonster即可计算出Berserk造成的伤害。但我想以正确的方式做。
最佳答案
如果您使用:
list<BaseObject> MonsterList; //This is where the Object list is defined.
您将只存储
BaseObject
。如果将任何派生类型的对象添加到列表中,则将丢失存储对象中的派生类型部分。进一步阅读:What is object slicing?
您需要存储的是指向
BaseObject
的指针,最好是智能指针。std::list<std::shared_ptr<BaseObject>> MonsterList;
从
std::shared_ptr<BaseObject>
中,您可以使用 std::shared_ptr<HardMonster>
获得dynamic_pointer_cast
。std::shared_ptr<BaseObject> baseObject;
std::shared_ptr<HardMonster> monster = std::dynamic_pointer_cast<HardMonster>(baseObject);
if ( monster )
{
// The cast is successful...
// Use monster
}