c++ - Dynamic_cast 失败,即使我(据我所知)肯定是从一个正确派生的类中转换的。

标签 c++ dynamic-cast

所以基本上我有一个类:

class Rigidbody
{
    Collider _collider;
    //blah
}

Collider 类看起来像

class Collider
{
    public:
        Collider(Transform trans);
        virtual ~Collider();

        void SetType(const ColliderType newType){_type = newType;}
        const ColliderType GetType(){return _type;}

        void SetTransform(const Transform& trans) { _transform = trans; }
        const Transform& GetTransform() { return _transform; }

    private:
        ColliderType _type;
        Transform _transform;
};

有几个派生类;例如:

class CircleCollider : public Collider
{
    public:
        CircleCollider(Transform trans);
        ~CircleCollider();

        const float GetRadius(){return _radius;}
        void SetRadius(const float newRad) { _radius = newRad; }

    private:
        float _radius;
};

在我的物理课中,基本上我必须调用正确的碰撞方法,基于哪些派生类正在碰撞(Box vs Circle 的代码不同于 Circle vs Circle)。所以我使用像

这样的东西
if(CircleCollider* circ1 = dynamic_cast<CircleCollider*>(&bodyA.GetCollider()))
{
    CircleVsCircle(circ1, circ2)
}

等等

为了测试这一点,我创建了一个刚体,然后执行

CircleCollider coll(player->GetTransform());
coll.SetRadius(10.0f);
player->SetCollider(coll);

所以玩家的collider应该是CircleCollider的一个实例。但是当我尝试将其动态转换到 CircleCollider 时,转换失败。

有什么想法吗?

最佳答案

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off

在您的RigidBody 类中,您存储了一个Collider 实例。不是从 Collider 派生的东西,而是 Collider

多态性意味着间接:如果你想存储从 Collider 派生的东西,你需要使用指针或引用。在您的示例中,这将是一个 Collider*(您可以重置它,并且 RigidBody 不拥有它)。

关于c++ - Dynamic_cast 失败,即使我(据我所知)肯定是从一个正确派生的类中转换的。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34242603/

相关文章:

c++ - 安装WxWidgets时遇到问题

c++ - 如何为模板类指定 "all parameterized types"或 "all argument lists"?

c++ - 可以接受使用虚拟继承来防止意外创建钻石吗?

c++ - 从基类转换到派生类抛出异常

c++ - 在 VS2013 中 union 包含模板类数组时出现错误 C2621

c++ - 配饰设计

c++ - 作为本地系统运行进程

ios - swift 中的 Dynamic Cast Class Unconditional 问题

c++ - dynamic_cast的继承与使用

c++ - 在 C++ 中 self 删除一个对象