我见过有人使用指向基类的指针容器来容纳共享相同虚拟函数的对象组。是否有可能使用派生类的重载函数与这些基类指针。这是很难解释我的意思,但(我认为)易于使用代码来显示如果你只有一个指向C++基类的指针,就用一个派生类参数重载一个函数
class PhysicsObject // A pure virtual class
{
// Members of physics object
// ...
};
class Circle : public PhysicsObject
{
// Members of circle
// ...
};
class Box : public PhysicsObject
{
// Members of box
// ...
};
// Overloaded functions (Defined elsewhere)
void ResolveCollision(Circle& a, Box& b);
void ResolveCollision(Circle& a, Circle& b);
void ResolveCollision(Box& a, Box& b);
int main()
{
// Container to hold all our objects
std::vector<PhysicsObject*> objects;
// Create some circles and boxes and add to objects container
// ...
// Resolve any collisions between colliding objects
for (auto& objA : objects)
for (auto& objB : objects)
if (objA != objB)
ResolveCollision(*objA, *objB); // !!! Error !!! Can't resolve overloaded function
}
我最初的想法是让这些功能是虚拟的类成员也(如下图所示),但我很快意识到,它具有完全相同同样的问题。
class Circle;
class Box;
class PhysicsObject // A pure virtual class
{
virtual void ResolveCollision(Circle& a) = 0;
virtual void ResolveCollision(Box& a) = 0;
// Members of physics object
// ...
};
class Box;
class Circle : public PhysicsObject
{
void ResolveCollision(Circle& a);
void ResolveCollision(Box& a);
// Members of circle
// ...
};
class Circle;
class Box : public PhysicsObject
{
void ResolveCollision(Circle& a);
void ResolveCollision(Box& a);
// Members of box
// ...
};
从Google上搜寻它看起来可能可以使用铸造解决,但我无法弄清楚如何找到正确的类型强制转换为(也实在是丑陋的)问题。我怀疑我问的是错误的问题,并且有更好的方法来构建我的代码来避免这个问题并获得相同的结果。
看看[double dispatch](https://en.wikipedia.org/wiki/Double_dispatch)。 – Jarod42
问题很明显 - 没有重载需要2个'PhysicsObject'作为参数,因此错误。要么提供超载,要么使用'dynamic_cast'。 –
当然,我可以创建一个需要两个PhysicsObjects的重载,但我仍然不知道它们是哪种类型的物理对象,所以我有同样的问题。谢谢@ Jarod42,现在会给它一个阅读。 – Beetroot