如何使说服编译器对象将成为派生类的对象
How to make convince compiler object will be an of a derived class?
我在继承方面遇到了问题,我不知道这是否是设计缺陷,如果是,如何处理它。我有一个有四个类的案例:两个基础和两个派生。我将使用另一个示例:
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> ...
是的,这似乎是一个设计缺陷。你的球员只会是BaseBallPlayers
或CricketPlayers
。而播放器将仅包含有关玩家的常见信息,即。年龄,姓名,出生日期等,而其专业化将包含有关其记录的信息。
两个建议。1> class Game
:每个游戏都有玩家。将Player * players;
更改为Player * **players;
。因此,游戏将包含动态分配的指向玩家的指针数组。
2> class BaseBallPlayer
和class player
.覆盖BaseBallPlayer::hitHomeRun
并声明与 virtual void Player::hitHomeRun
相同。
并将调用更改为players[i].hitHomeRun()
; 作为dynamic_cast<BaballPlayer*>(players[i])->hitHomeRun();
。 virtual
覆盖将调用BaseBallPlayer::hitHomeRun
。 dynamic_cast
仅适用于虚拟继承或基类应至少包含一个虚拟方法。
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 为什么此派生对象无法访问基类的后递减方法?
- 将带有派生模板的对象传递给接受具有基本模板的对象的功能
- 放置派生C++的新基子对象
- 在 C++ 中将对象转换为派生类型
- 链表包含 c++ 中不同的派生类对象
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 获取我的基类以递增派生类对象整数
- 派生类中的对象
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 按基类对象访问派生类资源时出错
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- static_cast将此对象派生到C++中的基类
- 如何在构造函数完成后立即销毁从 QWindow 对象派生的内容
- 我可以判断std::type_info对象是否等于另一个对象或从另一个对象派生的类吗?