Я кодировал простую настольную игру, чтобы изучать концепции C++ на практике. Я внедрил доску: она состоит из плиток, каждый из которых является дочерним классом, наследующим от родительского класса. Плата - это класс, в котором есть вектор плит.Доступ к функциям дочернего класса в родительском классе
Существует несколько видов плиток. Некоторые из них могут быть куплены игроками. Есть несколько различных видов покупаемых плиток, а также с различными свойствами, поэтому я счел это милым сделать базовый класс TileOnSale для плиток, которые можно купить, и создать дочерние классы реальных типов, два из которых я представил в приведенном ниже коде ,
Теперь моя проблема в том, как я могу получить доступ к функциям дочерних элементов, которые не определены в родительском классе (TileOnSale)? Совет получает инициализацию со всеми видами различных фрагментов, поэтому я могу извлечь Tile оттуда, используя функцию getTile (int location). Однако это интерпретируется как просто Плитка, а не TileOnSale или StreetTile. Я не знаю, как это понять.
Итак, есть ли устойчивый или даже лучший, аккуратный способ сделать это? Могу ли я создать шаблон или что-то, чтобы удержать объекты Tile, которые могут быть StreetTiles или StationTiles или что-то еще, что является Плиткой? Или я должен просто перепроектировать структуру класса?
Вот костяной код костей. Я попытался предоставить только то, что необходимо для понимания вопроса. Кроме того, первоначально Tile и Board были в своих заголовочных файлах. Я решил, что не обязательно показывать класс Player, у которого есть вектор принадлежащих TileOnSale объектов, но который сохраняет ту же проблему доступа, что и Board.
// Board.h
#include "Tile.h"
typedef vector<Tile> Tiles;
class Board
{
public:
Board();
~Board();
Tile getTile(int location);
private:
Tiles tiles;
};
// Tile.h
class Tile
{
public:
Tile();
~Tile();
protected:
tileType tile_type; // this is enum containing unique type
string description;
};
class TileOnSale : public Tile
{
public:
TileOnSale();
~TileOnSale();
virtual int getRent() const { return 0; };
};
class StreetTile : public TileOnSale
{
public:
StreetTile();
~StreetTile();
int getRent() override;
void buildHouses(int number);
private:
int houses;
};
class StationTile : public TileOnSale
{
public:
StationTile();
~StationTile();
int getRent() override;
};
EDIT: добавлен потенциально разъясняющий комментарий к коду.
Не уверен, что это то, что вы хотите. Но посмотрите http://stackoverflow.com/questions/14948957/c-type-casting-base-object-to-derived-object –
Да; это похоже на то, что я намерен. Спасибо, я вижу, есть несколько способов сделать это. – Twistor
Это же замечание кстати: вы должны использовать вектор. –