Думаю, вам лучше использовать std :: function (c ++ 11) или boost :: function (c ++ 03 + boost)
#include <iostream>
class Interface;
typedef void (Interface::*Callback)(void *data);
class Interface
{
public:
std::function<void(void*)> register;
Interface(std::function<void(void*)> register_)
: register(register_) //intializer list
{}
virtual ~Interface(){} //put me in
};
void Interface::Register(Callback func)
{
std::cout << "Register" << std::endl;
}
class B : public Interface
{
public:
B();
void Echo(void *data);
};
B::B()
: Interface( std::bind(B::Echo, this) )
{}
void B::Echo(void *data)
{
std::cout << "Echo" << std::endl;
}
Хотя почему вы не используетечистые виртуалы вне меня
class Interface
{
public:
virtual void Echo(void*)=0;
};
void B::Echo(void *data) //implements Echo
{
std::cout << "Echo" << std::endl;
}
интерфейс вызова-> эхо вызовет ребенка
, если вам нужна производительность, тогда используйте
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
И будьте очень осторожны с void * они обычно считаются плохими.
РЕДАКТИРОВАТЬ АДРЕСОВУЮ ТОЧКУ В КОММЕНТАРИЯХ: не чистые виртуалы
class Interface
{
public:
virtual ~Interface(){} //put me in
virtual void echo(void*){} //if implementation is not extended it will do nothing.
//others
};
Это не Java, интерфейсы не вещьопределяется языком.Таким образом, вы можете иметь интерфейс, который вы можете выбрать, который может выбрать, какую часть реализовать, если обратный вызов не касается вашего класса, тогда просто не реализуйте его.
void * плохо для всего хостапричин.из C ++ FAQ
избегать пустот * (держите их внутри низкоуровневых функций и структур данных, если они вам действительно нужны, и предоставляйте пользователям безопасные интерфейсы типов, обычно шаблоны) *
http://www2.research.att.com/~bs/bs_faq.html
поиск по "void *"
, но в основном void * обходить все типы безопасности, добавленные C ++.Это взлом в C, чтобы восполнить тот факт, что у него нет полиморфизма или общего кода.