因此,当您在继承中创建菱形时,大多数派生类都需要显式调用初始化程序列表中虚拟类的子对象的构造函数。
但是,对于那些从虚拟类继承而没有继承钻石本身的类呢?例如,继承自虚拟基类武器,它是否也需要调用它的初始化程序列表中的对象构造函数?
我已经有点纠结于所有的类继承和初始化列表,我只需要在继续并删除我的初始化程序列表中的任何不必要的调用之前先清理一下。
对象的构造函数接受一个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
}发布于 2020-04-05 19:05:12
因此,经过一些研究,有帮助的评论,玩和整理我的代码,我找出了答案和哪里出了问题。我为对象构造函数提供了一个默认参数,因此无论我是否将调用包含在类的初始化程序列表中,都会以这种方式调用对象构造函数。
从虚拟基类继承的类必须包括在初始化器列表中调用虚拟基类的子对象的构造函数,如果它们没有默认的构造函数。
因此,在我的示例中,由于Bow继承自继承自Object的虚拟基类武器,其初始化程序列表如下所示:
Bow::Bow() : Object(BOW_STARTING_POS), Weapon(BOW_SHOT_DELAY, BOW_STEALTH)
{
//constructor code
}为了完整起见,在没有默认构造函数的情况下,我将添加手榴弹初始化程序列表:
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
}手榴弹被分成两种结构,因为我的设计要求如此。在另一种情况下,对于从两个虚拟基类继承的类,只需要一个构造函数,则一个初始化程序列表可以包含所有构造函数调用:
Grenade::Grenade() : Object(GRENADE_STARTING_POS), Projectile(GRENADE_STARTING_POS, GRENADE_DAMAGE), Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH)
{
//constructor code
}https://stackoverflow.com/questions/60324371
复制相似问题