有没有办法调用一个函数的多个继承的重写?

时间:2019-05-06 08:11:38

标签: c++ diamond-problem

我有一个Item基类,还有一些子类都覆盖了函数'update()'。

class Item {
   virtual void update()
   {
      ;
   }
}

class BomblikeItem: public Item {
   int fuseTimer=10;
   void update()
   {
      fuseTimer--;
      if(fuseTimer==0)
         explode();
   }
}

class HeartlikeItem: public Item {
   void update()
   {
      beat();
   }
}

class RoboticItem: public Item {
   int energy=10;
   void update()
   {
      if(energy==0)
         shutdown();
   }
}

如果我尝试创建一个从两个或多个此类(例如机器人心脏)中继承的子对象,则会收到在多个基类中找到update()的错误。我不想在每种可能的混合搭配情况下都覆盖update(),但我希望能够制造出仍能像所有其他物品一样工作的新物品。

我当前的解决方案是将所有备用update()函数移至基本Item类中,并根据当前项目是否被标记为该类类型来确定何时应调用它,但是感觉很不对/效率低下:

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()”)的所有继承版本?

1 个答案:

答案 0 :(得分:0)

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

要处理Diamond问题,您可能需要将Item的虚拟基类作为其派生类。

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

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