Есть несколько способов сделать это в C ++. Трудно сказать, каков наилучший способ, это зависит от того, как вы будете его использовать, и приведенный вами пример слишком прост, чтобы рекомендовать конкретный способ c. Как правило, я бы сказал, что вы хотите получить c классы, определенные для протокола, из Handler
, а не наоборот, поэтому вы должны написать:
class Handler {
public:
virtual void Receive() {};
virtual void Send() {};
};
class B1: public Handler {
virtual void Receive() {
...
}
virtual void Send() {
...
}
};
int main() {
B1 handler1;
handler1.Receive();
...
}
Основная проблема здесь что вам нужно использовать virtual
функции-члены здесь, иначе базовый класс не знает, какую реализацию производного класса вызывать. Но это позволяет вам передавать Handler *
в качестве аргумента другой функции, которая затем будет работать с любым производным классом без использования шаблонов.
Другой вариант - использовать шаблон любопытно повторяющегося шаблона , который будет выглядеть так:
template <typename T>
class Handler {
void Receive() {
static_cast<T*>(this)->Receive();
}
void Send() {
static_cast<T*>(this)->Send();
}
};
class B1: public Handler<B1>
{
void Receive() {
...
}
void Send() {
...
}
};
int main() {
B1 handler1;
handler1.Receive();
...
}
Это позволяет избежать виртуальных методов. Он также очень похож на ваш class Handler
, но имеет то преимущество, что ему не нужна переменная-член T *object
.