首页 > 解决方案 > 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*>所以我不能将它作为其他任何东西传递。有没有办法检测正在传递的对象的子类并调用正确的重载?

标签: c++polymorphism

解决方案


您正在寻找的是所谓的多重调度。由于在编译时根据参数的静态类型确定调用哪个覆盖,因此您需要调用一个可以利用对象的运行时类型的函数,然后回调原始Player对象.

在您的Item基类中,您将声明此函数的基本情况:

virtual void AddToPlayer(Player &player);

它被定义为

void Item::AddToPlayer(Player &player) {
    player.AddItem(*this);
}

这与您已经拥有的没有什么不同。但是,您可以为每个类添加一个覆盖AddToPlayer,其定义与上面给出的基类相同。由于每个定义中的类型都不同,因此将调用*this不同的重载。Player::AddItem


推荐阅读