Итак, после некоторого исследования, полезных комментариев, игры и исправления моего кода, я выяснил ответ и что пошло не так. Я предоставлял конструктору Object аргумент по умолчанию, поэтому он вызывался таким образом, независимо от того, включил я вызов в список инициализаторов класса или нет.
Класс, который наследуется от виртуального базового класса должен включать вызовы конструкторов дочерних объектов виртуального базового класса в своем списке инициализаторов, если у них нет конструкторов по умолчанию .
Так что в моем примере, поскольку Bow наследует от виртуального базового класса Weapon, который наследует от Объект, его список инициализатора будет выглядеть так:
Bow::Bow() : Object(BOW_STARTING_POS), Weapon(BOW_SHOT_DELAY, BOW_STEALTH)
{
//constructor code
}
Для полноты я добавляю, какими должны быть списки инициализатора Grenade, когда нет конструктора по умолчанию:
Grenade::Grenade() : Object(GRENADE_STARTING_POS), Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH)
{
//weapon constructor code
}
Grenade::Grenade() : Object(GRENADE_STARTING_POS), Projectile(GRENADE_STARTING_POS, GRENADE_DAMAGE)
{
// projectile constructor code
}
PS граната разделен на два конструктора, потому что мой дизайн требовал именно этого. В другом случае, когда вам нужен только один конструктор для класса, унаследованного от двух виртуальных базовых классов, один список инициализатора может содержать все вызовы конструктора как таковые:
Grenade::Grenade() : Object(GRENADE_STARTING_POS), Projectile(GRENADE_STARTING_POS, GRENADE_DAMAGE), Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH)
{
//constructor code
}