C ++当我不知道子类型时,从基类中调用子类函数

杰克·H

我有一个存储“ InventoryItem”的库存。

struct InventoryItem{
Item* item;
unsigned int quantity;};

std::vector<InventoryItem> m_items;

我添加以下内容 m_inventory.addItem(bandage);

但是,当我尝试调用use()从Item基类派生的绷带功能时,它会use()改为调用Item类功能。

像这样在Item类中声明了它,

   // ....
public:
   // ....
    virtual void use(Player&){}
   // ....

像这样在绷带类中声明了它,

   // ....
class Bandage : public Item{
public:
   // ....
    virtual void use(Player&);
   // ....

像这样在Bandage类中定义了它,

void Bandage::use(Player& player)
{
    player.heal(35);
} 

例如,当我尝试调用项目的use()功能时,m_items.at(i).item->use(*m_player);

它调用基类的“项目”use()功能,而不是“绷带”use()功能。

编辑:这是我的addItem函数,

void Inventory::addItem(const Item& item)
{
    if ((m_items.size() < m_capacity))
    {
        bool foundItem(false);
        for (auto invItem : m_items)
        {
            // if the item already exists, lets just increase the quantity
            if (invItem.item->getID() == item.getID())
            {
                foundItem = true;
                if (invItem.quantity < invItem.item->getInventoryQuantityLimit())
                {
                    ++invItem.quantity;
                }
            }
        }

        if (!foundItem){
            m_items.push_back(InventoryItem{ new Item(item), 1 });
        }

    }
}
虚拟软件公司

问题出在您的addItem()职能上,更确切地说是在这里:

m_items.push_back(InventoryItem{ new Item(item), 1 });

指针Item*InventoryItem端部向上指向一个Item,而不是从派生的对象Item,即使item 一个派生对象。该表达式new Item(item)不会创建派生对象,而是Item使用派生对象item作为参数来调用(如果未编写,则为默认值)副本构造函数。然后,它Item在堆上创建对象,并返回指向它的指针。

使用创建所需项的工厂方法会更好,并且摆脱掉原始指针的支持std::shared_ptr(或std::unique_ptr,尽管这里可能std::shared_ptr更好)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以在C#的基类中捕获子类方法的异常吗?

来自分类Dev

我可以在不知道子类别的情况下列出其子类别吗?

来自分类Dev

调用每个继承基类的类而不知道该类是否存在c#

来自分类Dev

在向量C ++中从超类调用子类方法

来自分类Dev

我不知道Slick 2.1 Query类中的C [_]类型应该是什么

来自分类Dev

在C#中,子类继承了基类的“ using”指令吗?

来自分类Dev

我能否确定转换为父类的对象类型最初是否是C ++中的子类?

来自分类Dev

C ++当我不知道子类型时,从基类中调用子类函数

来自分类Dev

当基类在C#中是泛型时,如何将子类转换为基类

来自分类Dev

当参数是C ++中的父类类型时,如何调用子类的方法?

来自分类Dev

从基类C#调用子类方法

来自分类Dev

我们如何在C ++中从子类中调用父级重载的构造函数?

来自分类Dev

C ++我不知道在使用回调函数时使用“ this”和“ std :: placeholders :: _ 1”意味着什么

来自分类Dev

具有子类中的函数的抽象函数的C ++父类

来自分类Dev

C ++ freertos在获取信号失败后从子类调用基类的重写函数

来自分类Dev

Objective-C按基类调用子类

来自分类Dev

错误类c ++类。不知道是什么

来自分类Dev

反映C ++中基类的子类

来自分类Dev

目标C-返回子类的实例,但不知道它是什么

来自分类Dev

在PHP中,当我不知道子对象的名称时该如何访问?

来自分类Dev

我们可以在C#的基类中捕获子类方法的异常吗?

来自分类Dev

试图在C ++中的子类中调用父类的受保护函数

来自分类Dev

如何将对象转换为C ++ / CLI中我不知道类型参数的通用列表?

来自分类Dev

子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

来自分类Dev

在C ++中将基类类型2d向量中的子类对象推回

来自分类Dev

子类中的C ++基类函数重载

来自分类Dev

带有'operator='和vector的c++类,我不知道如何正确使用它

来自分类Dev

在 C# 中选择子类而不知道它的名称

来自分类Dev

当我不知道签名时如何调用函数?

Related 相关文章

  1. 1

    我们可以在C#的基类中捕获子类方法的异常吗?

  2. 2

    我可以在不知道子类别的情况下列出其子类别吗?

  3. 3

    调用每个继承基类的类而不知道该类是否存在c#

  4. 4

    在向量C ++中从超类调用子类方法

  5. 5

    我不知道Slick 2.1 Query类中的C [_]类型应该是什么

  6. 6

    在C#中,子类继承了基类的“ using”指令吗?

  7. 7

    我能否确定转换为父类的对象类型最初是否是C ++中的子类?

  8. 8

    C ++当我不知道子类型时,从基类中调用子类函数

  9. 9

    当基类在C#中是泛型时,如何将子类转换为基类

  10. 10

    当参数是C ++中的父类类型时,如何调用子类的方法?

  11. 11

    从基类C#调用子类方法

  12. 12

    我们如何在C ++中从子类中调用父级重载的构造函数?

  13. 13

    C ++我不知道在使用回调函数时使用“ this”和“ std :: placeholders :: _ 1”意味着什么

  14. 14

    具有子类中的函数的抽象函数的C ++父类

  15. 15

    C ++ freertos在获取信号失败后从子类调用基类的重写函数

  16. 16

    Objective-C按基类调用子类

  17. 17

    错误类c ++类。不知道是什么

  18. 18

    反映C ++中基类的子类

  19. 19

    目标C-返回子类的实例,但不知道它是什么

  20. 20

    在PHP中,当我不知道子对象的名称时该如何访问?

  21. 21

    我们可以在C#的基类中捕获子类方法的异常吗?

  22. 22

    试图在C ++中的子类中调用父类的受保护函数

  23. 23

    如何将对象转换为C ++ / CLI中我不知道类型参数的通用列表?

  24. 24

    子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

  25. 25

    在C ++中将基类类型2d向量中的子类对象推回

  26. 26

    子类中的C ++基类函数重载

  27. 27

    带有'operator='和vector的c++类,我不知道如何正确使用它

  28. 28

    在 C# 中选择子类而不知道它的名称

  29. 29

    当我不知道签名时如何调用函数?

热门标签

归档