所以基本上我有一个班级:
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时,演员阵容失败了。
任何想法为什么?
答案 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
对象,会发生什么。