當在C++中實現多態行爲時,可以使用純虛擬方法,也可以使用函數指針(或函子)。例如異步回調可以實現:虛擬方法或函數指針
方法1
class Callback
{
public:
Callback();
~Callback();
void go();
protected:
virtual void doGo() = 0;
};
//Constructor and Destructor
void Callback::go()
{
doGo();
}
所以使用回調這裏,你需要重寫杜高()方法來調用任何你想要的功能
方法2
typedef void (CallbackFunction*)(void*)
class Callback
{
public:
Callback(CallbackFunction* func, void* param);
~Callback();
void go();
private:
CallbackFunction* iFunc;
void* iParam;
};
Callback::Callback(CallbackFunction* func, void* param) :
iFunc(func),
iParam(param)
{}
//Destructor
void go()
{
(*iFunc)(iParam);
}
要在這裏使用回調方法,您需要創建一個函數指針,由Callback對象調用。
方法3
[這是通過我(安德烈亞斯)加入到問題;它不是由原始的海報]
template <typename T>
class Callback
{
public:
Callback() {}
~Callback() {}
void go() {
T t; t();
}
};
class CallbackTest
{
public:
void operator()() { cout << "Test"; }
};
int main()
{
Callback<CallbackTest> test;
test.go();
}
各有什麼實現的優點和缺點寫的?
或'go()'可以是一個模板函數,它可以帶*函數指針或帶重載的operator()(void *)的類。 – 2009-12-23 20:23:50
方法2是編譯器在實現方法1的過程中正在執行的操作。您不應該自己動手,因爲它有危險且容易出錯。 – 2009-12-23 20:38:39
很酷,謝謝Andreas的方法3 – doron 2009-12-23 20:45:06