所以基本上我有一堂课:

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);


因此,玩家的对撞机应该是CircleCollider的实例。但是,当我尝试将其动态投射到CircleCollider时,投射失败。

有什么想法吗?

最佳答案

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

为了使多态性起作用,Collider必须是一个指针,并且实际上已初始化为指向Rigidbody::_collider对象的指针。

相关阅读:object slicing(将CircleCollider对象分配给CircleCollider对象会发生这种情况)。

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

10-11 20:37