2011-01-12 86 views
0

我一直在研究Roguelike,并且遇到了一个问题。我的问题是我想使用“多态重载”或排序,但我猜C++不支持。是否有可能在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); 
}; 

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

感谢您的帮助!

+3

为什么不工作? – 341008 2011-01-12 05:35:33

回答

2

当然有效。我认为,尽管如此,当你将它传递给一个xMapObject *时,你期望它能够分辨出这种差异,而这种情况根本不会发生。

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

+0

你指的是哪个wiki? – 2016-03-18 09:21:34

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); 
}; 

} 
+0

这些类是这样设计的。我要做的是在重载时使用多态来找到正确的组合。 – 2011-01-12 13:12:05

相关问题