При реализации полиморфного поведения на С++ можно либо использовать чистый виртуальный метод, либо использовать указатели функций (или функторы). Например, асинхронный обратный вызов может быть реализован посредством:
Подход 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
[Это было добавлено мне на вопрос (Andreas); он не был написан оригинальным плакатом]
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();
}
Каковы преимущества и недостатки каждой реализации?