Возможно ли перегрузка полиморфных элементов в 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);
};
}