如何从另一个类重写方法? 情况如下:
class foot:
{
void kick() { clumsyKick(); };
}
class person: /* Person has Foot */
{
foot *personsFoot;
}
class soccerPlayer: /* SoccerPlayer has Foot too, but his foot is better */
{
foot *soccerPlayerFoot;
}
现在我想使用以下方法覆盖soccerPlayer类的foot类Kick()方法(我理解语法不正确):
soccerPlayer::foot::Kick() { expertKick(); }
在C ++中有可能吗? 此类情况的最佳解决方法是什么?
ps:我无法为foot :: Kick();
的每个实现创建一个派生类答案 0 :(得分:5)
直接的答案是你不能覆盖组合类的方法。只有继承才能覆盖。
在这种情况下,您可以使用其他设计模式,例如委托。 C ++本身不提供委托,但您可以模拟它们或使用提供实现的框架。您可以让foot
类为kick
的实施委派代理,并在soccerPlayer
类中提供备用代理。
您可以使用函数指针或使用单个方法抽象类来模拟委托。例如,您可以创建
class IKick{
public:
virtual void kick() = 0;
}
然后,您可以通过扩展IKick
的类提供person
的专门实现。
当然为了使kick方法做任何有用的事情,你可能想要改变签名,让一些参数将状态传递给调用者并形成调用者。
答案 1 :(得分:1)
我可以看到你想要做什么,但是Miky Dinescu是正确的,你不能以你所描述的方式做到这一点。
你可以通过继承来做到这一点,也就是说,有一个带有Kick方法的通用Person对象,并且有一个子类(SoccerPlayer)覆盖该方法:
class person: /* Person has Foot */
{
virtual void kick() { clumsyKick(); }
}
class soccerPlayer: /* SoccerPlayer has Foot too, but his foot is better */
{
virtual void kick() { expertKick(); }
}
但是,您似乎试图通过合成而不是继承来做到这一点。怎么样:
class foot
{
virtual void Kick() { clumsyKick(); }
}
class soccerFoot: foot
{
virtual void Kick() { expertKick(); }
}
class person: /* Person has Foot */
{
private foot *personsFoot;
person(foot* theFoot)
{
personsFoot = theFoot;
}
}
void main()
{
person soccerPlayer = new person(new soccerFoot());
person.Kick(); //output of expertKick();
}
这只是一个建议 - 但是有很多方法可以覆盖行为,这就是你试图做的事情,但你不能在没有继承的情况下覆盖另一个类的实际方法
答案 2 :(得分:0)
我认为DavidRodríguez指出了处理这种情况的正确方法:
class foot:
{
/* Foot internals */
}
class person: /* Person has Foot and uses it to kick */
{
foot *personsFoot;
void kick() { clumsyKick(foot); };
}
class soccerPlayer: /* SoccerPlayer has Foot too, but his KICK is better */
{
foot *soccerPlayerFoot;
void kick() { expertKick(foot); };
}