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

C++ Dynamic_cast失败,即使我(据我所知)肯定是从一个正确派生的类中进行了转换。,c++,dynamic-cast,C++,Dynamic Cast,所以基本上我有一门课: class Rigidbody { Collider _collider; //blah } 碰撞器类看起来像 class Collider { public: Collider(Transform trans); virtual ~Collider(); void SetType(const ColliderType newType){_type = newType;} cons

所以基本上我有一门课:

class Rigidbody
{
    Collider _collider;
    //blah
}
碰撞器
类看起来像

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的一个实例。但当我尝试将其动态转换为CircleCollider时,转换失败

你知道为什么吗?

我在这里只是猜测(因为你没有显示
GetCollider
函数),但是
GetCollider
函数返回
Rigidbody::\u collider
那么你实际上没有
CircleCollider
对象,你所拥有的只是
collider
对象

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off
要使多态性发挥作用,
刚体::\u collider
需要是一个指针,并且实际初始化为指向
CircleCollider
对象的指针

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off
相关阅读:(如果您将
CircleCollider
对象分配给
\u collider
对象,就会发生这种情况)。

我只是在这里猜测(因为您没有显示
GetCollider
函数),但是
GetCollider
函数返回
Rigidbody::\u collider
那么你实际上没有一个
CircleCollider
对象,你所拥有的只是一个
collider
对象

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off
要使多态性发挥作用,
刚体::\u collider
需要是一个指针,并且实际初始化为指向
CircleCollider
对象的指针

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off
相关阅读:(如果将
CircleCollider
对象指定给
\u collider
对象,就会发生这种情况)。

类刚体
{
对撞机;
}; // < 这个已经脱落了
刚体
类中,存储
碰撞器
的实例。不是从
碰撞器
派生的东西,而是
碰撞器

多态性意味着间接性:如果您希望存储从
Collider
派生的内容,则需要使用指针或引用。在您的示例中,这将是一个
碰撞器*
(您可以重置它,而
刚体不拥有它)。

类刚体
{
对撞机;
}; // < 这个已经脱落了
刚体
类中,存储
碰撞器
的实例。不是从
碰撞器
派生的东西,而是
碰撞器


多态性意味着间接性:如果您希望存储从
Collider
派生的内容,则需要使用指针或引用。在您的示例中,这将是一个
碰撞器*
(您可以重置它,而
刚体不拥有它)。

啊,非常感谢!因此,基本上,当我设置碰撞器时,编译器将CircleCollider向上投射到碰撞器(或沿着这些线的东西)?编辑:我要给约阿希姆一个“答案”,因为他先回答了。已“提取”了
环形碰撞器的
碰撞器
部分,以分配给另一个
碰撞器
,并且衍生部分已被切掉(参见Joachim的回答)。就整个项目而言,另一个可能对您有所帮助的概念是访问者模式,它将以可扩展的方式取代那些
dynamic\u cast
s。再次感谢!关于访客模式,我一定会调查的!“多态性意味着间接性”嗯,不是真的,但我理解你为什么这么想。@LightnessRace我知道你激起了我的好奇心。是否存在完全避免间接寻址的多态性实例?我从你们那里得到的信息并不是直接反驳这一定是牵强的:呸,非常感谢!因此,基本上,当我设置碰撞器时,编译器将CircleCollider向上投射到碰撞器(或沿着这些线的东西)?编辑:我要给约阿希姆一个“答案”,因为他先回答了。已“提取”了
环形碰撞器的
碰撞器
部分,以分配给另一个
碰撞器
,并且衍生部分已被切掉(参见Joachim的回答)。就整个项目而言,另一个可能对您有所帮助的概念是访问者模式,它将以可扩展的方式取代那些
dynamic\u cast
s。再次感谢!关于访客模式,我一定会调查的!“多态性意味着间接性”嗯,不是真的,但我理解你为什么这么想。@LightnessRace我知道你激起了我的好奇心。是否存在完全避免间接寻址的多态性实例?我从你那里得到的信息并不是直接反驳这一定是牵强的:非常感谢你,约阿希姆!谢谢你的额外阅读,在我回到编码之前,我会先看一下!非常感谢你,约阿希姆!谢谢你的额外阅读,在我回到编码之前,我会先看一下!