C ++でポリモーフィックな動作を実装する場合、純粋仮想メソッドを使用するか、関数ポインター(または関数)を使用できます。たとえば、非同期コールバックは次の方法で実装できます。
アプローチ1
class Callback
{
public:
Callback();
~Callback();
void go();
protected:
virtual void doGo() = 0;
};
//Constructor and Destructor
void Callback::go()
{
doGo();
}
したがって、ここでコールバックを使用するには、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();
}
各実装の長所と短所は何ですか?