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

126
16

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


Диаграмма моего класса выглядит следующим образом:


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


Это было бы очень приятно, так как это значительно упростило бы код, определяющий, кто в него влечет, но поскольку это не работает, есть ли еще один объектно-ориентированный подход, подобный этому? Или лучший вариант для кастования объектов, чтобы определить, что они собой представляют?


Спасибо за любую помощь!

спросил(а) 2021-01-25T18:11:37+03:00 5 месяцев назад
1
Решение
77

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

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

ответил(а) 2021-01-25T18:11:37+03:00 5 месяцев назад
45

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


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

}

ответил(а) 2021-01-25T18:11:37+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема