C ++方法从合成中的另一个类重写

时间:2013-03-12 14:00:32

标签: c++

如何从另一个类重写方法? 情况如下:

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();

的每个实现创建一个派生类

3 个答案:

答案 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); };
}