2012-04-08 20 views
0

靜態方法,我需要傳遞一個對象的靜態方法,使用下面的代碼的回調函數:使用派生類的,如C函數回調++

glutDisplayFunc(callback) 

哪裏callback是一些類的靜態方法 - baseClass::callback()。它編譯好。但是現在我想要派生類(擁有baseClass,因爲它是父級)具有相同的回調函數 - 也就是說,我想覆蓋回調函數。

我已經在derivedClass中覆蓋了它,但derivedClass::callback()沒有被調用。

PS。我打電話給glutDisplayFunc(callback)與基類。代碼如下所示:

baseClass::someFunction(){ 
    glutDisplayFunc(callback); 
} 

我如何通過derivedClass::callback,而不是baseClass::callback withing的baseClass?方法的所有方法都是靜態的。

+0

覆蓋成員函數的FWIW僅適用於虛擬函數,並且靜態成員函數不能是虛擬的。 – 2012-04-08 07:29:16

回答

2

C++不支持虛擬靜態方法,所以你不能直接做你想做的事情。你應該能夠做的是創建一個非靜態的虛方法,它返回一個函數指針,並在你的派生類中覆蓋它,以返回一個指向它的靜態回調方法的指針。

即是這樣的:

class A 
{ 
public: 
    typedef void(*CallbackFunction)(void); 

public: 
    static void callback(void) 
    { 
     std::cout << "A::callback" << std::endl; 
    } 

    virtual CallbackFunction getCallback() 
    { 
     return callback; 
    } 

    void someFunction() 
    { 
     glutDisplayFunc(getCallback()); 
    } 

}; 

class B: public A 
{ 
public: 
    static void callback(void) 
    { 
     std::cout << "B::callback" << std::endl; 
    } 
    CallbackFunction getCallback() 
    { 
     return callback; 
    } 
}; 

不完全是理想,但它是不支持上下文參數Ç回調一個體面的解決辦法。

+0

謝謝,它的工作。 :) – giga 2012-04-08 08:08:08

2

簡短的回答是,你不能,而且你通常不想。基類通常不應該直接瞭解具體派生函數。

通常的模式是在調用虛函數的基類中有一個靜態函數,然後覆蓋派生類中的虛函數。我不確定這是否適用 - 儘管如此 - 爲了工作,您需要能夠獲取傳遞給回調函數的參數。您傳遞的參數是一個指向對象的指針,因此您將其轉換回基礎對象類型,然後從該指針調用正確的虛擬函數。

但是,在glutDisplayFunc的特定情況下,我不相信這是可能的 - 它不允許您獲取傳遞給回調函數的參數。如果你想要採用這種編程風格,恐怕除了切換到除GLUT之外的東西外,沒有任何真正的治療方法。