c++ - 从父类(super class)对象数组调用子类方法

标签 c++ class oop abstract-class abstract

我正在用 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;
}

但是,您必须为每个子类(PropertyCommunityChest 等)尝试动态向下转换,这可能会使代码看起来笨拙.

建议2:在GameSquare中添加getPrice()

正如一些评论者所建议的,您可以将方法 getPrice() 添加到 GameSquare 类中。如果方 block 不是 Property,则返回 0。这使您可以检查某物是 Property 还是其他东西。

关于c++ - 从父类(super class)对象数组调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367118/

相关文章:

c++ - 为什么 pthread_mutex_t 在尝试通过来自两个不同进程的共享内存进行锁定时会出现段错误?

python - 如何在类级别正确使用装饰器?

java - 计算同一类别内距离的“告诉-不要-询问”原则

c++ - Qt 可以缩短一条线,使其不退出到达终点吗?

c++ - 二维动态数组的值在循环迭代期间被损坏

java - Eclipse:搜索 Java 类注释等中的文本

javascript - 为什么我必须在 OOP Javascript 中使用 constructor.prototype?

javascript - 闭包如何访问被破坏的变量?

c++ - 我如何有效地遍历多种类型的树?

c# - 为什么静态类不能有非静态方法和变量?