C++ 从虚拟基类继承而不产生菱形问题时,请更正初始值设定项列表

C++ 从虚拟基类继承而不产生菱形问题时,请更正初始值设定项列表,c++,inheritance,multiple-inheritance,base-class,virtual-inheritance,C++,Inheritance,Multiple Inheritance,Base Class,Virtual Inheritance,因此,当您在继承中创建菱形时,最派生的类需要显式调用其初始值设定项列表中虚拟类的子对象的构造函数 但是,如果类继承自虚拟类,而不是继承本身创建菱形,那么这些类又如何呢例如,Bow继承自虚拟基类武器,Bow是否也需要在其初始值设定项列表中调用对象的构造函数?为什么? 我已经有点纠结于所有的类继承和初始值设定项列表,我只需要在继续之前先把事情弄清楚,并删除初始值设定项列表中任何不必要的调用 对象的构造函数接受一个sf::Vector2f,它是两个浮点数。到目前为止,我已经将移动、武器和投射物作为虚拟

因此,当您在继承中创建菱形时,最派生的类需要显式调用其初始值设定项列表中虚拟类的子对象的构造函数

但是,如果类继承自虚拟类,而不是继承本身创建菱形,那么这些类又如何呢例如,Bow继承自虚拟基类武器,Bow是否也需要在其初始值设定项列表中调用对象的构造函数?为什么?

我已经有点纠结于所有的类继承和初始值设定项列表,我只需要在继续之前先把事情弄清楚,并删除初始值设定项列表中任何不必要的调用

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

//sf::Vector2f是一种SFML数据类型,由两个浮点组成
类对象
{
私人:
向量2f m_pos;
公众:
对象(sf::Vector2f start_pos){m_pos=start_pos;};
}
类:虚拟公共对象
{
公众:
可移动(sf::Vector2f start_pos):对象(start_pos){…};
}
类武器:虚拟公共对象
{
公众:
武器(浮动射击延迟,bool isStealth):对象(sf::Vector2f(0,0)){…};
}
类别:公众可移动
{
公众:
射弹(sf::矢量2F起始点,int伤害):可移动(起始点){…};
}
职业弓:公共武器
{
公众:
弓箭():武器(弓箭射击延迟,弓箭隐形){…};
}
等级手榴弹:公共武器,公共射弹
{
公众:
手榴弹():武器(手榴弹射击延迟,手榴弹隐形){};//用于武器
手榴弹(sf::Vector2f startPos):投射物(startPos,手榴弹_伤害);//用于投射物
}

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

从虚拟基类继承的类如果没有默认构造函数,则必须在其初始值设定项列表中包含虚拟基类子对象的构造函数调用

所以在我的示例中,由于弓继承自虚拟基类武器,而虚拟基类武器继承自对象,其初始值设定项列表如下所示:

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
}
p.S.手榴弹被分成两个构造器,因为我的设计要求这样。在另一种情况下,继承自两个虚拟基类的类只需要一个构造函数,一个初始值设定项列表可以包含所有构造函数调用,如下所示:

Grenade::Grenade() : Object(GRENADE_STARTING_POS), Projectile(GRENADE_STARTING_POS, GRENADE_DAMAGE), Weapon(GRENADE_SHOT_DELAY, GRENADE_STEALTH)
{
  //constructor code
}

请显示您的代码()。如果你继承了,那么你可能想调用基类的构造函数,不管是虚拟的还是非虚拟的。我删除了我的答案,因为它不是一个好的答案。它帮助我发现了我的理解上的一个漏洞,但对你的特殊情况没有任何帮助。我再次恳请您提供一个示例,您需要初始化每个直接或间接虚拟基类,无论是否有菱形。好的,给我一些时间为您编写一个简单的示例,我认为无论您是否找到答案,都可以不使用代码来回答,像这样复杂的多重继承层次结构会让人头疼。考虑到您的示例可能只是游戏中的一小部分,我建议您考虑使用类似实体组件系统(Entity Component System,ECS)的模式,通过分离数据、功能和交互来简化代码。