如何使说服编译器对象将成为派生类的对象

How to make convince compiler object will be an of a derived class?

本文关键字:对象 派生 编译器 何使      更新时间:2023-10-16

我在继承方面遇到了问题,我不知道这是否是设计缺陷,如果是,如何处理它。我有一个有四个类的案例:两个基础和两个派生。我将使用另一个示例:

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成员本身?

这几乎是标准的。

template <typename P>
class Game {
   std::vector<P> players;
...
class Player ...
class BaseballPlayer : public Player ...
class BaseballGame : public Game<BaseballPlayer> ...

是的,这似乎是一个设计缺陷。你的球员只会是BaseBallPlayersCricketPlayers。而播放器将仅包含有关玩家的常见信息,即。年龄,姓名,出生日期等,而其专业化将包含有关其记录的信息。

两个建议。1> class Game:每个游戏都有玩家。将Player * players;更改为Player * **players;。因此,游戏将包含动态分配的指向玩家的指针数组。

2> class BaseBallPlayerclass player.覆盖BaseBallPlayer::hitHomeRun并声明与 virtual void Player::hitHomeRun 相同。

并将调用更改为players[i].hitHomeRun() ; 作为dynamic_cast<BaballPlayer*>(players[i])->hitHomeRun();virtual覆盖将调用BaseBallPlayer::hitHomeRundynamic_cast仅适用于虚拟继承或基类应至少包含一个虚拟方法。