1

次のような Button クラスがあります。

class Button {    
    protected:
        SDL_Rect box;

    public:
        Button(string id, int x, int y, int w, int h);
        ~Button();
        virtual void handleEvent(SDL_Event event);
};

そして、特別な種類のボタン、MyButton があります。

class MyButton : public Button {    
    public:
        MyButton(string id, int x, int y, int w, int h);
        ~MyButton();
        void handleEvent(SDL_Event event);          
};

問題は、代わりにMyButton::handleEvent()返すメソッドが必要です。これを行う最もエレガントな方法は何ですか?intvoid

編集:これが必要な理由はMyButton、他のクラスで他のことを行うために、いつ押されたかを知る必要があるためです。

4

2 に答える 2

2

結局のところ、継承の概念MyButtonはのインスタンスですButton。これが意味するのは、すでにhandleEventメソッドが定義されてMyButtonおり、同じ名前で2つの異なるリターンタイプのメソッドを使用する必要がないということです。

これは、整数を返すメソッドが必要な場合は、整数参照パラメーターを使用しoverloadhandleEventメソッドをMyButton入力し、その値を参照に設定できることを意味します。

class MyButton : public Button {    
    public:
        MyButton(string id, int x, int y, int w, int h);
        ~MyButton();
        void handleEvent(SDL_Event event, int& out_param);          
};
于 2012-10-14T01:41:53.673 に答える
0

あなたは何かをすることができますが、それは醜いです:

mybutton.h

class MyButton : public Button {
    protected:
        SDL_Rect box;

    public:
        MyButton(string id, int x, int y, int w, int h);
        ~MyButton();
        void handleEvent(SDL_Event event);
        int handleEvent_int(SDL_Event event);
};

mybutton.cpp

#include "mybutton.h"
void MyButton::handleEvent(SDL_Event event) {
    this->handleEvent_int(event);
}

int MyButton::handleEvent_int(SDL_Event event) {
    //Override it here but with return.
}

main.cpp

int main() {
    Button* button=new MyButton();
    button->handleEvent(...);
    MyButton* myButton=(MyButton*)button;
    int result=myButton->handleEvent_int(...);
}

intを返すまったく新しい関数を作成し、別の名前で呼び出します。値を返さずに、これで仮想関数をオーバーライドします。

于 2012-10-14T01:49:20.107 に答える