2013-06-03 2 views
1

Я пишу класс интерфейса для различных типов сообщений протокола. Я не могу переписать код базового протокола, чтобы дать каждому протоколу общий интерфейс. Я создаю базовый класс с общим интерфейсом с классами-оболочками для каждого конкретного протокола.виртуальная функция с переменными типами возврата

Таким образом, каждый класс-оболочка будет иметь общий интерфейс, а затем в моем коде для обработки сообщений протокола можно использовать полиморфизм т.е.

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; 
} 
+0

Это то, что шаблоны для. –

+0

Виртуальный метод нельзя шаблонировать – nouney

+0

@nouney: Откуда у вас это? – slaphappy

ответ

0

Вы можете сделать это:

class A {}; 
class B : A {}; 
class C : A {}; 

class IFoo 
{ 
public: 
    virtual A * func() = 0; 
}; 

class BFoo 
{ 
public: 
    virtual B * func(); 
}; 

class CFoo 
{ 
public: 
    virtual C * func(); 
}; 
+0

Это интересно, но не совсем уверен, как это мне помогает? –

Смежные вопросы