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
}

10-07 23:12