Я пишу класс интерфейса для различных типов сообщений протокола. Я не могу переписать код базового протокола, чтобы дать каждому протоколу общий интерфейс. Я создаю базовый класс с общим интерфейсом с классами-оболочками для каждого конкретного протокола.виртуальная функция с переменными типами возврата
Таким образом, каждый класс-оболочка будет иметь общий интерфейс, а затем в моем коде для обработки сообщений протокола можно использовать полиморфизм т.е.
message* msg = new protocol_a_msg(a_msg);
Тогда я могу использовать функции с сообщением * параметром для обработки и т.д., что является Великий.
Однако в конечном итоге мне нужно получить базовое сообщение протокола. поэтому я хотел написать виртуальную функцию, которая получает основное сообщение. т.е. в базовом классе сообщений:
<type> get_msg() = 0;
Но проблема в этом будет различной. Означает ли это, что у меня не может быть виртуальной функции, потому что тип возврата меняется?
Если я не могу этого сделать, мне нужно будет указать конкретный тип оболочки протокола и использовать определенную функцию. Что бы сработало, но мне интересно, что это лучший способ.
Вот мой код до сих пор:
#include <iostream>
class message {
public:
enum msg_type { PROTOCOLTYPE, BINARYTYPE, UNKNOWNTYPE };
message(msg_type type = PROTOCOLTYPE) : type_(type) {}
void set_type(msg_type type) { type_ = type; }
msg_type get_type() const { return type_; }
msg_type type_;
virtual ~message() {}
// Can I make this a generic get underlying data virtual function?
// virtual underlying_msg get_msg() const { return <underlying_msg>; }
//may also need a set_msg(msg) - or can initialise protocol msg in ctor
};
//this is existing protocol code which I cannot change
class protocol_a {
public:
enum a_type { SMALL, MEDIUM, LARGE };
protocol_a(a_type a) : atype_(a) { }
const char* get_data() {
static const char* const names[] = { "SMALL", "MEDIUM", "LARGE" };
return names[atype_];
}
protected:
a_type atype_;
};
class protocol_a_msg : public message {
public:
protocol_a_msg(protocol_a * a) : proto_(a) {}
protocol_a* get_msg() const { return proto_; }
protocol_a* proto_;
};
int main() {
protocol_a a_msg(protocol_a::SMALL);
protocol_a_msg* pa_msg = new protocol_a_msg(&a_msg);
//retrieve underlying protocol_a msg
protocol_a* a = pa_msg->get_msg();
const char* s = a->get_data();
std::cout << "protocol_a data=" << s << std::endl;
delete [] pa_msg;
return 0;
}
Это то, что шаблоны для. –
Виртуальный метод нельзя шаблонировать – nouney
@nouney: Откуда у вас это? – slaphappy