Возможно ли перегрузка полиморфных элементов в C++?

Я работал над 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 ответа

Решение

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

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

Это возможно, но этот дизайн кажется мне неудобным.

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

}
Другие вопросы по тегам