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我知道你激起了我的好奇心。是否存在完全避免间接寻址的多态性实例?我从你那里得到的信息并不是直接反驳这一定是牵强的:非常感谢你,约阿希姆!谢谢你的额外阅读,在我回到编码之前,我会先看一下!非常感谢你,约阿希姆!谢谢你的额外阅读,在我回到编码之前,我会先看一下!