2013-05-01 86 views
0

我正在面對使用繼承和重載的意外行爲。 或者說我錯了。將繼承的類作爲(void *)傳遞給回調函數

(如this post建議)我有誰使用一個回調函數的C API響應類:從第一個繼承

class APIWrapper { 
protected: 
    // This callback is registered to a C api 
    static void _messageCallback(double deltatime, vector< unsigned char > *message, void *userData); 

public: 
    void manageNewMessage(double deltatime, vector<unsigned char> *message); 
}; 

void APIWrapper::_messageCallback(double deltatime, vector< unsigned char > *message, void *userData) { 
    ((APIWrapper*) userData)->manageNewMessage(deltatime, message); 
} 

和A類。

class MyController : public APIWrapper { 
public: 
    void manageNewMessage(double deltatime, vector<unsigned char> *message) { 
     // Customization 
     message.at(1) = 0; 
     APIWrapper::manageNewMessage(deltatime, message); 
    } 
}; 

如果我聲明一個MyController對象,該重載方法MyController::manageNewMessage(double, vector<unsigned char>*)不會被調用。 這是正常行爲嗎?

回答

3

我沒有看到函數是virtual,因爲你的繼承方法能夠通過動態綁定動態調用,它在祖先類中必須是virtual

virtual void manageNewMessage(double deltatime, vector<unsigned char> *message); 

此外,如果APIWrapper類的方法不應該做任何事情,那麼你可以聲明爲純虛:

virtual void manageNewMessage(double deltatime, vector<unsigned char> *message) = 0; 

這樣就可以避免在聲明甚至一個空方法父類,最重要的是,如果您忘記(或者在簽名中出現任何錯誤)以覆蓋該方法,則代碼將無法編譯。這是因爲所有純虛擬方法必須在子類中實現才能分配新實例。

+0

我知道這很簡單。所以在我的情況下,它只是虛擬的(不純),感謝精確度。 – muxisar 2013-05-01 22:07:26

相關問題