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

ここで、soccerPlayerクラスのfootクラスの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

David Rodrí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); };
}
于 2013-03-12T14:18:53.483 に答える