【发布时间】:2020-06-05 00:58:20
【问题描述】:
所以我知道,当您在继承中创建菱形时,最派生类需要在其初始化列表中显式调用虚拟类的子对象的构造函数。
但是从虚拟类继承而没有创建菱形本身的继承的类呢? 例如Bow 继承自虚拟基类 Weapon,Bow 是否也需要在其初始化列表中调用 Object 的构造函数?为什么?
我对所有的类继承和初始化列表有点纠结,我只需要先清理一下,然后再继续并删除初始化列表中的任何不必要的调用。
Object 的构造函数采用 sf::Vector2f,它是两个浮点数。到目前为止,我已经将 Movable、Weapon 和 Projectile 作为虚拟基类,因为它们是菱形的一部分。
// 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
}
【问题讨论】:
-
请出示您的代码 (minimal reproducible example)。如果你继承,那么你可能想要调用基类的构造函数,无论是否是虚拟的
-
我删除了我的答案,因为它不是一个好答案。它帮助我找出了我理解中的一个漏洞,但它对您的特定情况没有任何帮助。恳请您再次提供minimal reproducible example
-
你需要初始化每个直接或间接的虚拟基类,不管有没有钻石。
-
好吧,给我一些时间给你写一个最小的例子,我认为这是无需代码就能回答的问题
-
无论你是否找到答案,像这样复杂的多继承层次结构都会让人头疼。鉴于您的示例可能只是您的游戏的一小部分,我建议您考虑使用实体-组件-系统 (ECS) 之类的模式,通过分离数据、功能和交互来简化您的代码。
标签: c++ inheritance multiple-inheritance base-class virtual-inheritance