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
}
关于c++ - 你如何从一个基础对象向下转换为一个子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30737700/