Dynamic_cast 失败了,尽管我(据我所知)肯定是从正确派生的 class 投射的。
Dynamic_cast fails, even though I am(as far as I can tell) definitely casting from a properly-derived class.
所以基本上我有一个 class:
class Rigidbody
{
Collider _collider;
//blah
}
Collider
class长得像
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;
};
有几个派生的 classes;例如:
class CircleCollider : public Collider
{
public:
CircleCollider(Transform trans);
~CircleCollider();
const float GetRadius(){return _radius;}
void SetRadius(const float newRad) { _radius = newRad; }
private:
float _radius;
};
在我的物理学中 class,基本上我必须调用正确的碰撞方法,基于派生的 classes 碰撞(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);
所以玩家的collider应该是CircleCollider的一个实例。但是当我尝试将其动态投射到 CircleCollider 时,投射失败。
知道为什么吗?
我只是在这里猜测(因为你没有显示 GetCollider
函数),但是 GetCollider
函数 returns Rigidbody::_collider
那么你不实际上有一个CircleCollider
对象,你只有一个Collider
对象。
要使多态性起作用,Rigidbody::_collider
需要是一个指针,并且实际上被初始化为一个指向 CircleCollider
对象的指针。
相关阅读:object slicing(如果将 CircleCollider
对象分配给 _collider
对象,就会发生这种情况)。
class Rigidbody
{
Collider _collider;
}; // < This had fallen off
在您的 RigidBody
class 中,您存储了 Collider
的一个实例。不是从 Collider
派生的东西,而是 Collider
.
多态性意味着间接:如果你想存储从 Collider
派生的东西,你需要使用指针或引用。在您的示例中,那将是 Collider*
(您可以重置它,并且 RigidBody
不拥有它)。
所以基本上我有一个 class:
class Rigidbody
{
Collider _collider;
//blah
}
Collider
class长得像
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;
};
有几个派生的 classes;例如:
class CircleCollider : public Collider
{
public:
CircleCollider(Transform trans);
~CircleCollider();
const float GetRadius(){return _radius;}
void SetRadius(const float newRad) { _radius = newRad; }
private:
float _radius;
};
在我的物理学中 class,基本上我必须调用正确的碰撞方法,基于派生的 classes 碰撞(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);
所以玩家的collider应该是CircleCollider的一个实例。但是当我尝试将其动态投射到 CircleCollider 时,投射失败。
知道为什么吗?
我只是在这里猜测(因为你没有显示 GetCollider
函数),但是 GetCollider
函数 returns Rigidbody::_collider
那么你不实际上有一个CircleCollider
对象,你只有一个Collider
对象。
要使多态性起作用,Rigidbody::_collider
需要是一个指针,并且实际上被初始化为一个指向 CircleCollider
对象的指针。
相关阅读:object slicing(如果将 CircleCollider
对象分配给 _collider
对象,就会发生这种情况)。
class Rigidbody
{
Collider _collider;
}; // < This had fallen off
在您的 RigidBody
class 中,您存储了 Collider
的一个实例。不是从 Collider
派生的东西,而是 Collider
.
多态性意味着间接:如果你想存储从 Collider
派生的东西,你需要使用指针或引用。在您的示例中,那将是 Collider*
(您可以重置它,并且 RigidBody
不拥有它)。