2011-01-12 79 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

相關問題