c++ - C ++:另一个类中的多个派生类的重载
问题描述
我正在制作一个基于文本的冒险游戏(我知道是原创的。)我遇到了一个问题。我想让玩家拿起一个物品,然后根据它所属的子类自动将它放在它所属的位置Item
。我进行了设置,以便当玩家键入“get”后跟当前房间中的对象名称时,将调用以下函数:
void Game::PickUp(Item * item)
{
m_map.at(m_player.GetLoc())->RemoveItem(item); //Remove item from the room
m_player.AddItem(item); //Add item to the player
}
在Player
类中,我重载AddItem(…)
如下:
void AddItem(Armor* armor)
{
delete m_armor;
m_armor = armor;
}
void AddItem(Weapon* weapon)
{
delete m_weapon;
m_weapon = weapon;
}
void AddItem(Shield* shield)
{
delete m_shield;
m_shield = shield;
}
void AddItem(Item* item)
{
m_pack.push_back(item);
}
当我运行代码时,它只调用void AddItem(Item* item)
,这是有道理的,因为这是传递给前一个函数的内容,但由于传递的对象保存在 a 中,vector<Item*>
所以我不能将它作为其他任何东西传递。有没有办法检测正在传递的对象的子类并调用正确的重载?
解决方案
您正在寻找的是所谓的多重调度。由于在编译时根据参数的静态类型确定调用哪个覆盖,因此您需要调用一个可以利用对象的运行时类型的函数,然后回调原始Player
对象.
在您的Item
基类中,您将声明此函数的基本情况:
virtual void AddToPlayer(Player &player);
它被定义为
void Item::AddToPlayer(Player &player) {
player.AddItem(*this);
}
这与您已经拥有的没有什么不同。但是,您可以为每个类添加一个覆盖AddToPlayer
,其定义与上面给出的基类相同。由于每个定义中的类型都不同,因此将调用*this
不同的重载。Player::AddItem
推荐阅读
- batch-file - 批量重命名文件反转位置名称
- jenkins - 静态分析工具 groovyParser 无法扫描控制台日志输出,请定义文件模式 - Jenkins 警告下一代插件
- android - 通过导航架构组件进行深度链接后的返回导航
- dns - 如何从威瑞信的 com 区域文件中提取带有/不带有 whois 的域?
- java - 模板模式,但其中一个类未实现该方法
- unix - Dockerfile 中的 Unix sed 命令
- json - 我将正确的 JSON 格式正文从 Postman 发送到我的路径,但我收到 400 Bad Request 错误
- c# - System.Speech.Synthesis 和 Microsoft.Speech.Synthesis 有什么区别?
- python - 如何将所有键值保存到数组变量中
- javascript - 如何根据字段值设置标志真/假?