Я просто пишу простую систему инвентаря, которую хочу использовать для RPG-игры, и я застрял в начале. Я создал несколько классов: Предмет, Оружие и Меч. Где Оружие наследует от Предмета, а Меч - от Оружия. Я хочу сделать классы Предметов и Оружия виртуальными, но я действительно не знаю, вот код.
main. cpp
#include <iostream>
#include <vector>
#include "sword.hpp"
int main()
{
using Item = Project::Item;
using Sword = Project::Sword;
std::vector<Item*> vec;
vec.push_back(Sword(10));
return 0;
}
item.hpp
#pragma once
namespace Project
{
class Item
{
private:
protected:
public:
virtual void abstract() = 0; //<- My idea, function that will just make this class abstract
Item();
virtual ~Item();
};
}
вещь. cpp
#include "item.hpp"
namespace Project
{
Item::Item()
{
}
Item::~Item()
{
}
}
Weapon.HPP
#pragma once
#include "item.hpp"
namespace Project
{
//Enum which will help me to identify all kinds of weapons
//I used everywhere '_' prefix, because it won't conflict with normal classes
enum WeaponId
{
_Sword = 0,
_Axe = 1,
_Bow = 2
};
class Weapon : public Item
{
private:
protected:
const WeaponId id;
unsigned int damage;
public:
//<- Doesn't have declaration of 'abstract()', because it's virtual
Weapon(const WeaponId& id, const unsigned int& damage = 0);
virtual ~Weapon();
};
}
Оружие. cpp
#include "weapon.hpp"
namespace Project
{
Weapon::Weapon(const WeaponId& id, const unsigned int& damage)
: Item(), id(id)
{
}
Weapon::~Weapon()
{
}
}
Sword.hpp
#pragma once
#include "weapon.hpp"
namespace Project
{
class Sword : public Weapon
{
private:
public:
void abstract() = 0; //<- Makes that this class isn't still an abstract class
Sword(const unsigned int& damage);
~Sword();
};
}
меч. cpp
#include "sword.hpp"
namespace Project
{
Sword::Sword(const unsigned int& damage)
: Weapon(WeaponId::_Sword, damage)
{
}
Sword::~Sword()
{
}
}
И это хороший способ сказать, что любой должен быть виртуальным? Я думаю, что нет, но я все еще задаюсь вопросом о функции, которая будет присутствовать в каждом элементе и будет работать по-разному (возможно, это будет выглядеть лучше).