我有一个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()”)的所有继承版本?
答案 0 :(得分:0)
您对当前的解决方案是正确的,将很难维护/扩展这样的代码。理想情况下,Item
类应该是抽象类,其所有方法都是纯虚方法。但是,如果它解决了您的问题,那么您可能仍然拥有“ update”作为具有基本实现的虚拟方法。
要处理Diamond问题,您可能需要将Item
的虚拟基类作为其派生类。
class BomblikeItem: virtual public Item
~~~~~~~
{
// ...
}
class HeartlikeItem: virtual public Item
~~~~~~
{
// ...
}