我正在用 C++ 实现 Monopoly 游戏。我正在处理一个抽象父类(super class) BoardSquare
(其唯一属性是方 block 名称),根据游戏方 block 的类型(无论是属性、机会等)有各种子类
现在,由于我想将棋盘表示为一个数组,而方 block 的类型不同,我声明了一个 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()
给出错误
‘class GameSquare’ has no member named ‘getPrice’
这告诉我指针仍被视为 GameSquare。有没有解决的办法?也许是类型转换?还是一个更优雅的实现?
最佳答案
这是 object slicing 的一个很好的例子.
建议一:动态向下转型
防止它的一种方法是添加以下内容:
Property *b1 = dynamic_cast<Property*>(board[index]);
if (b1)
{
int b = b1->getPrice(); // Or whatever getPrice() returns;
}
但是,您必须为每个子类(Property
、CommunityChest
等)尝试动态向下转换,这可能会使代码看起来笨拙.
建议2:在GameSquare中添加getPrice()
正如一些评论者所建议的,您可以将方法 getPrice()
添加到 GameSquare
类中。如果方 block 不是 Property
,则返回 0
。这使您可以检查某物是 Property
还是其他东西。
关于c++ - 从父类(super class)对象数组调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367118/