Dynamic_cast失败了,即使我(据我所知)肯定是从正确派生的类中进行投射。

时间:2015-12-12 17:08:43

标签: 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)
}

为了测试这个,我创建了一个Rigidbody,然后执行

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

所以玩家的对手应该是CircleCollider的一个实例。但是当我尝试将它动态转换为CircleCollider时,演员阵容失败了。

任何想法为什么?

2 个答案:

答案 0 :(得分:3)

class Rigidbody
{
    Collider _collider;

}; // < This had fallen off

RigidBody课程中,您存储Collider的实例。不是来自Collider,而是来自Collider

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

答案 1 :(得分:1)

我只是在这里猜测(因为你没有显示GetCollider功能),但是GetCollider函数返回Rigidbody::_collider然后你就不知道了实际上拥有一个CircleCollider对象,你所拥有的只是一个Collider对象。

要使多态性起作用,Rigidbody::_collider需要是一个指针,并实际初始化为指向CircleCollider对象的指针。

相关阅读:object slicing(如果您将CircleCollider对象分配给_collider对象,会发生什么。