【发布时间】:2019-05-06 08:11:38
【问题描述】:
我有一个 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()”?
【问题讨论】:
-
您应该能够通过在其前面加上类名来指定您正在谈论的
update(),例如BomblikeItem::update()或HeartlikeItem::update() -
您最好 1) 将
update()函数声明为虚拟函数,2) 将update()函数调用从子代传递到其父代,3) 避免像钻石一样的继承。 -
我认为可以通过将对象转换为相应的类型来实现
-
也许你真正需要一个事件处理系统?对于这种行为建模,我不建议采用多重继承路线,我认为您会面临很多痛苦。
-
你没有将
update()函数声明为virtual是不是错字?
标签: c++ diamond-problem