【发布时间】:2015-12-08 07:34:15
【问题描述】:
我在继承方面遇到问题,我不知道这是否是设计缺陷,如果是,如何解决。我有一个包含四个类的案例:两个基类和两个派生类。我将使用另一个示例:
class Player { // base class for a player in general
...
}
class Game { // base class for a game in general
...
Player * players; // dynamically allocated at run-time
...
}
class BaseballPlayer : public Player {
...
void hitHomeRun();
...
}
class BaseballGame : public Game {
...
...
players[i].hitHomeRun(); // this causes compiler error
}
我得到的错误是因为方法没有在基类中定义,但是数组是基类类型的。在BaseballGame 类中,只有BaseballPlayers 被加载到数组中,但我无法说服编译器。这是选角问题吗?我如何保证编译器 players 将充满正确的对象?我可以在派生类中用BaseballPlayer * team 覆盖Player * players 成员本身吗?
【问题讨论】:
-
搜索并阅读有关downcasting的信息。
-
我做了这件事,我写了一个构造函数 BaseBallPlayer(Player&) ,然后就投了它。它可以编译,但我担心它不会对原始对象执行突变...
-
使用 C++ 容器,例如
std::array或std::vector -
@MichaelLongauer,该构造函数创建了一个新对象,您不希望这样,您只想强制转换现有对象以告诉编译器它的类型(如上所述使用
dynamic_cast,或如果您确定BaseballGame中的所有玩家都是BaseballPlayers,那么您可以使用static_cast)。但是,n.m. 下面的答案是一个更干净的选项,不需要强制转换。 -
是的,你有一个巨大的设计缺陷。您的设计不是面向对象的,因为
Player似乎没有被设计为面向对象的基类。它没有虚函数;Player的客户必须手动查询子类型才能做一些有用的事情。只需很少的额外工作,您就可以消除设计中的所有基类。
标签: c++ inheritance polymorphism