У меня есть инвентарь, в котором хранятся файлы InventoryItem.
struct InventoryItem{
Item* item;
unsigned int quantity;};
std::vector<InventoryItem> m_items;
Я добавляю такие элементы, как следующие, m_inventory.addItem(bandage);
Но когда я пытаюсь вызвать функцию use()
Bandages, которая была получена из базового класса Item, вместо этого вызывается функция use()
класса Item.
Он был объявлен в классе Item следующим образом:
// ....
public:
// ....
virtual void use(Player&){}
// ....
Он был объявлен в классе Bandage следующим образом:
// ....
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);
Он вызывает функцию базового класса «Item» use()
, а не функцию «Bandage» 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
. - person vsoftco   schedule 05.04.2015std::vector<InventoryItem> m_items;
неверен: присвоение записи даже правильного типа приведет к ее сокращению доInventoryItem
. На самом деле у вас не может быть вектора ~ любого производного типа ~, компилятор понятия не имеет, как его выделить. Что вам нужно сделать, так это сохранить указатели на них - все указатели на структуры одинаковы, поэтому указатель на повязку работает просто отлично, и доступ к его базе инвентаря через этот указатель, конечно, также работает. - person jthill   schedule 05.04.2015