首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不产生菱形问题的情况下从虚拟基类继承时正确的初始化程序列表

在不产生菱形问题的情况下从虚拟基类继承时正确的初始化程序列表
EN

Stack Overflow用户
提问于 2020-02-20 16:20:58
回答 1查看 213关注 0票数 0

因此,当您在继承中创建菱形时,大多数派生类都需要显式调用初始化程序列表中虚拟类的子对象的构造函数。

但是,对于那些从虚拟类继承而没有继承钻石本身的类呢?例如,继承自虚拟基类武器,它是否也需要调用它的初始化程序列表中的对象构造函数?

我已经有点纠结于所有的类继承和初始化列表,我只需要在继续并删除我的初始化程序列表中的任何不必要的调用之前先清理一下。

对象的构造函数接受一个sf::Vector2f,它是两个浮点数。到目前为止,我已经有可移动的,武器和弹丸作为虚拟基类,因为他们是钻石的一部分。

代码语言:javascript
复制
// 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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 19:05:12

因此,经过一些研究,有帮助的评论,玩和整理我的代码,我找出了答案和哪里出了问题。我为对象构造函数提供了一个默认参数,因此无论我是否将调用包含在类的初始化程序列表中,都会以这种方式调用对象构造函数。

从虚拟基类继承的类必须包括在初始化器列表中调用虚拟基类的子对象的构造函数,如果它们没有默认的构造函数

因此,在我的示例中,由于Bow继承自继承自Object的虚拟基类武器,其初始化程序列表如下所示:

代码语言:javascript
复制
Bow::Bow() : Object(BOW_STARTING_POS), Weapon(BOW_SHOT_DELAY, BOW_STEALTH)
{
  //constructor code
}

为了完整起见,在没有默认构造函数的情况下,我将添加手榴弹初始化程序列表:

代码语言:javascript
复制
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
}

手榴弹被分成两种结构,因为我的设计要求如此。在另一种情况下,对于从两个虚拟基类继承的类,只需要一个构造函数,则一个初始化程序列表可以包含所有构造函数调用:

代码语言:javascript
复制
Grenade::Grenade() : Object(GRENADE_STARTING_POS), Projectile(GRENADE_STARTING_POS, GRENADE_DAMAGE), Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH)
{
  //constructor code
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60324371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档