c++ - 你如何从一个基础对象向下转换为一个子对象

标签 c++ casting

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/

相关文章:

python - Qt 调试崩溃/退出 python 并最终无法正确调试(例如,不在断点处停止)

C++:如何为安全系统调用转义用户输入?

c++ - 如何将参数传递给 Clang 插件?

c++ - 具有两级指针的 const_cast

c++ - 为什么单独循环中的元素加法比组合循环中的元素加法快得多?

c++ - 通过 USB 命令步进电机 Controller

c - 浮点表示的问题

Swift Cast 泛型类型

sql-server - SQL Server 2008 将 varchar 转换为日期时间

vb.net - VB 中的后期绑定(bind)和类型问题