【发布时间】:2013-12-19 16:30:44
【问题描述】:
我一直在编写一个简单的棋盘游戏,以在实践中学习 C++ 的概念。我已经实现了板:它由瓦片组成,每个瓦片都是从父类继承的子类。棋盘是一个具有图块向量的类。
有几种瓷砖。其中一些可以被玩家购买。有几种不同类型的可购买瓷砖以及不同的属性,所以我认为为可以购买的瓷砖创建一个基类 TileOnSale 并创建实际类型的子类很可爱,其中两个我在下面的代码中提供.
现在我的问题是如何访问未在父类 (TileOnSale) 中定义的子成员函数? Board 使用各种不同的图块进行初始化,因此我可以使用 getTile(int location) 函数从那里提取一个图块。但是,这被解释为只是一个 Tile,而不是 TileOnSale 或 StreetTile。我不知道以这种方式掌握 StreetTile 的 buildHouses 功能。
那么,有没有一种健壮的,甚至更好的简洁的方法来做到这一点?我可以制作一个模板或其他东西来保存可能是 StreetTiles 或 StationTiles 或其他 Tile 的 Tile 对象吗? 还是我应该重新设计类结构?
这是一个简单的代码。我试图只提供理解问题所需的内容。此外,最初 Tile 和 Board 位于它们自己的头文件中。我决定没有必要展示具有自有 TileOnSale 对象向量但保留与 Board 完全相同的访问问题的 Player 类。
// 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;
};
编辑:为代码添加了一个潜在的澄清注释。
【问题讨论】:
-
不确定这是您想要的。不过看看stackoverflow.com/questions/14948957/…
-
是的;这看起来像我的意图。谢谢,我知道有几种方法可以做到这一点。
-
顺便说一句:你应该使用矢量
。 -
第一条评论(来自 VusP)对我来说是非常有用的信息。虽然访问者模式已经解决了几个问题,但指针转换已经解决了其他几个问题。所以,感谢您指出这一点。
标签: c++ inheritance