Возможно ли иметь полиморфную перегрузку членов в C ++? - PullRequest
0 голосов
/ 12 января 2011

Я работал над Roguelike, и столкнулся с проблемой с ним. Моя проблема в том, что я хотел бы использовать «полиморфную перегрузку» или сортировку, но я предполагаю, что C ++ не поддерживает.

Моя диаграмма классов выглядит так:

xMapObject <- xEntity <- xVehicle </p>

Проблема в том, что это возможно:

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 ]

2 голосов
/ 12 января 2011

Конечно, это работает.Однако я думаю, что вы ожидаете, что он сможет определить разницу, когда вы передадите ему xMapObject *, а этого просто не произойдет.

Вам необходим механизм двойной отправки.Возможно, посетитель, но я в этом сомневаюсь.См. Modern C ++ Design или wiki для мультиметодов.

0 голосов
/ 12 января 2011

Возможно, но этот дизайн мне кажется неуклюжим.

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

}
...