0

我想要一个由它们的基类链接的对象列表。所以我将有一个类来管理所有不同风格的对象,但以它们的基类形式统一存储。我希望能够处理两个对象之间的测试碰撞,一个是球体,另一个是立方体。我会说调用一个像 sphere->collisionTest(cube) 这样的函数。使用多态性我可以调用碰撞测试方法,它将转到球类中的适当方法,但我需要一种方法来识别/覆盖球类中的碰撞测试方法。覆盖 sphere.collisionTest(sphere) 或 sphere.collisionTest(cube) 的参数。这是我尝试过的一些示例代码。在这里当我调用collisionTest(object-> getObject()) 方法我相信我应该得到立方体对象,然后它将参数覆盖并调用collisionTest(Cuboid *object) 方法。相反,它调用相同的碰撞测试(Geom *object)。

int main()
{
Geom *geomHandler1;// = new Geom();
Geom *geomHandler2;// = new Geom();

Sphere *sphereGeom = new Sphere();
Cuboid *cuboidGeom = new Cuboid();

geomHandler1 = (Geom*)sphereGeom;
geomHandler2 = (Geom*)cuboidGeom;

geomHandler1->collisionTest(geomHandler2);


return 0;
}



#include "Sphere.h"

void Sphere::collisionTest(Geom *object)
{
collisionTest(object->getObject());
}

void Sphere::collisionTest(Cuboid *object)
{

}

Sphere* Sphere::getObject()
{
Sphere *husk = new Sphere();
return husk;
}



#include "Cuboid.h"

void Cuboid::collisionTest(Geom *object)
{

}

void Cuboid::collisionTest(Sphere *object)
{

}

Cuboid* Cuboid::getObject()
{
Cuboid *husk = new Cuboid();
return husk;
}
4

2 回答 2

1

您要问的是谷歌的“双重调度”。不幸的是,在 C++ 中确实没有简单、干净的方法来进行双重调度。普通的方法是让每个几何类型返回一个给出其类型的枚举;然后你可以打开对象返回的类型枚举, static_cast 它,并调用适当的函数。

于 2013-09-08T14:29:45.860 回答
0

这就是枚举类型的意思吗?

void Sphere::collisionTest(Geom *object)
{
switch (object->getID())
{
    case SPHERE : sphCollTest((Sphere*)object);
    break;
    case CUBOID : cubCollTest((Cuboid*)object);
    break;

}
}
于 2013-09-08T18:32:27.847 回答