2012-10-14 96 views
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()方法返回int而不是void。什麼是最優雅的方式來做到這一點?

編輯:我需要這個的原因是因爲我需要知道何時按MyButton以便在其他類中做其他事情。

+1

如果你需要一個具有不同簽名的函數,那麼你就錯過了繼承的語義。只是稱它爲另一個名字。 – imreal

+0

我該如何處理原始簽名?我只是把它留空了? –

+0

沒有必要重寫它,如果你不聲明它,將使用父類的方法。也許你可以提供一些關於你想要做什麼的背景。 – imreal

回答

2

畢竟以繼承的概念MyButtonButton的一個實例。這意味着您已經有了中定義的handleEvent方法,我們不能使用具有相同名稱和兩種不同返回類型的方法。

這意味着,如果你想有一個返回一個整數,你可以用一個整數參考參數overloadMyButtonhandleEvent方法,你可以在基準設置它的值的方法。

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);   
}; 
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的全新函數,並以不同的名稱調用它。 用此替代虛函數而不返回它的值。