1

如何覆盖另一个类的方法?情况如下:

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;
}

现在我想只使用以下方法覆盖 footballPlayer 类的脚类 Kick() 方法(我理解下面的语法不正确):

soccerPlayer::foot::Kick() { expertKick(); }

在 C++ 中可能吗?这种情况的最佳解决方法是什么?

ps:我负担不起为 foot::Kick(); 的每个实现创建派生类;

4

3 回答 3

6

直接的答案是您不能覆盖组合类的方法。只有继承才有可能覆盖。

在这种情况下,您可以使用其他设计模式,例如委托。C++ 本身不提供委托,但您可以模拟它们或使用提供实现的框架。您可以使foot该类接受一个委托来实现kick并在该类中提供一个替代委托soccerPlayer

您可以使用函数指针或使用单个方法抽象类来模拟委托。例如,您可以创建

class IKick{
    public:
    virtual void kick() = 0;
}

IKick然后,您可以拥有由扩展的类提供的专门实现person

当然,为了使 kick 方法做任何有用的事情,您可能希望更改签名以具有一些将状态传递给调用者并形成调用者的参数。

于 2013-03-12T14:02:42.933 回答
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();
}

这只是一个建议-但是有很多方法可以覆盖行为,这似乎是您正在尝试做的事情,但是您不能在没有继承的情况下覆盖另一个类的实际方法。

于 2013-03-12T14:12:14.600 回答
0

我认为大卫罗德里格斯指出了处理这种情况的正确方法:

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); };
}
于 2013-03-12T14:18:53.483 回答