C++ 是否有方法调用函数的多个继承重写?

C++ 是否有方法调用函数的多个继承重写?,c++,diamond-problem,C++,Diamond Problem,我有一个Item基类和几个子类,它们都覆盖函数“update()” 如果我尝试创建一个新的子对象,该子对象继承自两个或多个此类(如机器人心脏),我会得到一个错误,即在多个基类中发现update()。我不想为每种可能的混合和匹配情况覆盖update(),但我希望能够创建新项目,使其仍然像所有项目一样工作 我当前的解决方案是将所有备用update()函数移到基类中,并根据当前项是否标记为该类类型来确定何时调用它,但这感觉非常错误/低效: class Item { ,,, void upd

我有一个Item基类和几个子类,它们都覆盖函数“update()”

如果我尝试创建一个新的子对象,该子对象继承自两个或多个此类(如机器人心脏),我会得到一个错误,即在多个基类中发现update()。我不想为每种可能的混合和匹配情况覆盖update(),但我希望能够创建新项目,使其仍然像所有项目一样工作

我当前的解决方案是将所有备用update()函数移到基类中,并根据当前项是否标记为该类类型来确定何时调用它,但这感觉非常错误/低效:

class Item {
   ,,,
   void update()
   {
      if(isType(Bomblike))
         Bomblike realForm=this->dynamicCastTo(bomb)
         realForm->fuseTimer--;
         if(realForm->fuseTimer==0)
            realForm->explode();

      if(isType(Heartlike)
         ,,,
      ,,,
   }
}

class BomblikeItem: public Item {
   int fuseTimer=10;
}

,,,

有没有更好的办法?是否有一种方法可以顺序调用单个重写函数(如“update()”)的所有继承版本?

您对当前解决方案的看法是正确的,维护/扩展此类代码将很困难。理想情况下,
Item
类应该是抽象类,其所有方法都是纯虚拟方法。但如果它解决了您的问题,那么您可能仍然有“update”作为基本实现的虚拟方法

要处理菱形问题,您可能需要为其派生类创建
Item
虚拟基类

class BomblikeItem: virtual public Item 
                    ~~~~~~~
{
    // ... 
}

class HeartlikeItem: virtual public Item 
                     ~~~~~~
{
    // ... 
}

您对当前解决方案的看法是正确的,维护/扩展此类代码将非常困难。理想情况下,
Item
类应该是抽象类,其所有方法都是纯虚拟方法。但如果它解决了您的问题,那么您可能仍然有“update”作为基本实现的虚拟方法

要处理菱形问题,您可能需要为其派生类创建
Item
虚拟基类

class BomblikeItem: virtual public Item 
                    ~~~~~~~
{
    // ... 
}

class HeartlikeItem: virtual public Item 
                     ~~~~~~
{
    // ... 
}

您应该能够通过使用类名作为前缀来指定您正在谈论的
update()
,例如
BomblikeItem::update()
HeartlikeItem::update()
您最好1)将
update()
函数声明为虚拟函数,2)将
update()
函数调用从子函数传播到其父函数,3)避免菱形继承。我认为将对象强制转换为相应的类型是可能的。您真正需要的是事件处理系统吗?对于这种行为建模,我不建议采用多重继承方法,我认为您将面临很多痛苦。您不将
update()
函数声明为
virtual
,这是一种输入错误吗?您应该能够通过在它前面加上类名来指定您正在谈论的
update()
,像
BomblikeItem::update()
HeartlikeItem::update()
您最好1)将
update()
函数声明为虚拟函数,2)将
update()
函数调用从子函数传播到其父函数,3)避免菱形继承。我认为将对象强制转换为相应的类型是可能的。您真正需要的是事件处理系统吗?对于这种行为建模,我不建议采用多重继承的方式,我认为您将面临很多困难。您不将
update()
函数声明为
virtual
,这是一种输入错误吗?