Итак, я понимаю, что когда вы создаете ромб в наследовании, наиболее производный класс должен явно вызывать конструктор подобъектов виртуального класса в его списке инициализаторов.
Но как насчет классов, которые наследуются от виртуального класса без того, чтобы это наследование создавало сам алмаз? например, Bow наследуется от виртуального базового класса Weapon, нужен ли Bow вызов конструктора Object в его списке инициализаторов и почему?
Я немного запутался со всеми наследованиями классов и списками инициализаторов, и мне просто нужно сначала прояснить ситуацию, прежде чем продолжить, и удалить все ненужные вызовы в моих списках инициализаторов.
Конструктор объекта принимает sf :: Vector2f, который представляет собой два числа с плавающей запятой. До сих пор в качестве виртуальных базовых классов у меня были «Подвижность», «Оружие» и «Снаряд», поскольку они являются частью алмаза.
// sf::Vector2f is an SFML data type which consists of two floats
class Object
{
private:
sf::Vector2f m_pos;
public:
Object(sf::Vector2f start_pos) {m_pos = start_pos;};
}
class Movable : virtual public Object
{
public:
Movable(sf::Vector2f start_pos) : Object(start_pos) { ... };
}
class Weapon : virtual public Object
{
public:
Weapon(float shotDelay, bool isStealth) : Object(sf::Vector2f(0,0)) { ... };
}
class Projectile : public Movable
{
public:
Projectile (sf::Vector2f startPos, int damage) : Movable(startPos) { ... };
}
class Bow : public Weapon
{
public:
Bow() : Weapon(BOW_SHOT_DELAY, BOW_STEALTH) { ... };
}
class Grenade : public Weapon, public Projectile
{
public:
Grenade() : Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH) {};//for Weapon
Grenade(sf::Vector2f startPos) : Projectile(startPos, GRENADE_DAMAGE);//for Projectile
}