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

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

私が代わりにこのような何かをするだろうと思いますか? – 341008

答えて

2

確かに動作します。私はあなたがそれをxMapObject *に渡すと違いを伝えることができると期待していますが、それは単に起こらないと思います。

ダブルディスパッチ機構が必要です。おそらく訪問者が、私はそれを疑っている。マルチメソッドについては、Modern C++ Designまたはwikiを参照してください。

+0

どのwikiを参照していますか? –

0

これは可能ですが、このデザインは私にとっては厄介なようです。それは動作しませんなぜ

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

クラスはこのように設計されています。私がしようとしているのは、適切な組み合わせを見つけるためにオーバーロードするときに多型を使用できることです。 –

関連する問題