c – 设计一个函数,它将两个抽象的基类对象作为参数,并根据对象的Derived类做不同的事情

==编辑3 ==

最后,我刚刚将一个checkIntersect(Shape)和checkIntersectSpecific(Circle / Polygon / Triangle)抽象方法添加到Shape中,并使它们调用我的免费(非成员)函数,这些函数已经在一个地方实现,同时使用了一些预处理器和标题技巧,以保存自己一些重复的代码,以防我需要添加其他子类.为了完成起见,我会标记杰弗弗里的答案,因为他是最接近我所做的,但是我很感谢你们所有人向我展示了一些我实际上不了解的很酷的东西(功能模板)并将我链接到另外两个问题也提出了访客/双重调度作为解决方案.

虽然我不得不说,但我希望我们能很快看到C中的多种方法.

==编辑超过==

所以我有一个基类Shape及其子项:Triangle,Polygon,Circle和Vector以及10个静态函数,它们使用不同的所述子对来检查它们是否相交.
我还有一个GameObject类,它有一个Shape *成员,我想实现碰撞检测.出于这个原因,我需要像bool checkIntersection(Shape *,Shape *)这样的东西适用于任何形状.

我最初的想法是只有一个(形状,形状)函数,并以某种方式检查形状的类型,然后调用适当的交叉检查函数,但我读到这称为RTTI,通常被认为是坏的.我读到了访客和双重调度,但我看到的方式,这些并没有真正解决我的问题.如果我错了,请随时纠正我.无论如何,现在我被卡住了.我几乎没有想到这个标题.

EDIT2:它不一定需要像这样设计.我只需要稍微易于维护,如果我决定稍后再添加另一个子类,则最好不需要更新每个Shape子类.

编辑:
澄清一下,这是我想要完成的事情:

class Shape {...} //this is an abstract class
class Circle : public Shape {...}
class Triangle : public Shape {...} 
class Polygon : public Shape {...}

bool checkIntersection(const Shape &s1, const Shape &s2)
{
//Do some magic and call the right function
}

bool checkIntersection(const Circle &c, const Triangle &t) {..check...}
bool checkIntersection(const Circle &c, const Polygon &p) {...check...}
//and the rest of the functions for the different combinations

class GameObject
{
    Shape * shape;//Shape is abstract
    bool collidesWith(const GameObject& obj)
    {
        return checkIntersection(*this->shape, *obj.shape);
    }
}
最佳答案
您正在尝试擦除类型,然后使用该类型.这没什么意义.只需使用重载.不需要在那里使用基类:

checkIntersection(const& Triangle, const& Polygon) { ... }
checkIntersection(const& Triangle, const& Circle) { ... }
// ...

checkIntersection(const& Polygon p, const& Triangle t) {
    return checkIntersection(t, p);
}
// ...

转载注明原文:c – 设计一个函数,它将两个抽象的基类对象作为参数,并根据对象的Derived类做不同的事情 - 代码日志