При реализации полиморфного поведения на 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);
}
чтобы использовать метод обратного вызова здесь вам нужно будет создать указатель на функцию можно назвать объектом обратного вызова.
подход 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();
}
Каковы преимущества и недостатки каждой реализации?
Или 'go()' может быть функцией шаблона, которая может принимать * либо * указатель на функцию или класс с переопределенным 'operator() (void *)'. –
Подход 2 - это то, что компилятор делает за сенами для реализации подхода 1. Вы не должны делать это сами, потому что это опасно и подвержено ошибкам. –
Прохладный, спасибо Андреасу за подход 3 – doron