Я реализую игру Монополия в C++. Я имею дело с абстрактным суперклассом BoardSquare
(чье единственное свойство - это квадратное имя), с различными подклассами в зависимости от типа игрового квадрата (будь то свойство, шанс и т. Д.)Вызов метода подкласса из массива объектов суперкласса
Теперь, поскольку я хочу представлять доска как массив и квадраты различаются по типам, я объявил массив BoardSquare
указателей:
GameSquare** board = new GameSquare*[40];
и продолжала заполнять каждую запись в зависимости от типа:
board[1] = new Property("Old Kent Road", 0);
board[2] = new CommunityChest();
board[3] = new Property("Whitechapel Road", 0);
и так далее.
В настоящее время Property
, например, имеет специальные методы, такие как getPrice()
. Но работает
board[1]->getPrice()
дает ошибку
«класса GameSquare» не имеет элемента с именем «getPrice»
, который говорит мне, что указатель все еще рассматривается как GameSquare. Есть ли способ обойти это? Может быть? или более элегантная реализация?
Вам нужно будет проверить тип вашего экземпляра, чтобы он мог передать его в подтип, чтобы вызвать базовый метод. – Piou
@Piou Не могли бы вы привести синтаксический пример? Например, я знаю, что 'board [1]' является свойством, поэтому я могу запустить '((Property *) board [1]) -> getPrice()'? –
Другим решением было бы реализовать виртуальный метод 'getPrice' в классе GameSquare, который возвращает -1, переопределяя его в' Property', чтобы вернуть цену, переданную конструктору. Затем в вашей логике отображения вы просто проверяете, что цена> 0, чтобы отобразить информацию. – Piou