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