是否有可能在C ++中进行多态成员重载?

时间:2011-01-12 05:23:29

标签: c++ oop polymorphism overloading

我一直在研究Roguelike,并遇到了问题。我的问题是我想使用“多态重载”或排序,但我猜C ++不支持。

我的班级图是这样的:

xMapObject< - xEntity< - xVehicle

问题是,可以这样做:

class xMapObject
{
  public:
    virtual void Bump(xMapObject *MapObject);
    virtual void Bump(xEntity *Entity);
    virtual void Bump(xVehicle *Vehicle);

    virtual void BumpedBy(xMapObject *MapObject);
    virtual void BumpedBy(xEntity *Entity);
    virtual void BumpedBy(xVehicle *Vehicle);
};

这将是一个非常好的,因为它会极大地简化决定谁碰到什么的代码,但由于这不起作用,是否有另一种类似于此的面向对象的方法?或者是铸造物体的最佳选择,以确定它们是什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

确实有效。我认为,虽然你希望它能够在传递xMapObject *时能够区分它,但这根本就不会发生。

您需要双重调度机制。也许访客,但我怀疑它。请参阅Modern C ++ Design或wiki for multimethods。

答案 1 :(得分:0)

这是可能的,但这种设计对我来说似乎很尴尬。

namespace {

class xEntity;
class xVehicle;

class xMapObject {
  public:
    virtual void Bump(xMapObject *MapObject);
    virtual void Bump(xEntity *Entity);
    virtual void Bump(xVehicle *Vehicle);

    virtual void BumpedBy(xMapObject *MapObject);
    virtual void BumpedBy(xEntity *Entity);
    virtual void BumpedBy(xVehicle *Vehicle);
};

class xEntity : public xMapObject {};

class xVehicle : public xMapObject {};

}

我想我会做这样的事情:

namespace {

class xMapObject {
public:
    virtual void Bump(xMapObject *MapObject);
    virtual void BumpedBy(xMapObject *MapObject);
};

class xEntity : public xMapObject {
public:
    void Bump(xMapObject *MapObject);
    void BumpedBy(xMapObject *MapObject);
};

class xVehicle : public xMapObject {
public:
    void Bump(xMapObject *MapObject);
    void BumpedBy(xMapObject *MapObject);
};

}