2016-07-12 1 views
-1

Этот вопрос, возможно, является дубликатом this, но я не понимаю, как ответ применяется к моему приложению. У меня есть базовый класс с несколькими производными классами. Методы класса должны иметь одинаковое имя. Приложение получает сообщения UDP, которые необходимо декодировать по-разному на основе типа датаграммы. Например, как можно декодировать в BaseDatagram вызов декодирования в DerivedDatagramA или DerivedDatagramB?Как вызвать производный метод из базы

class DerivedDatagramA: public BaseDatagram 
{ 
    ... 
}; 

class DerivedDatagramB: public BaseDatagram 
{ 
    ... 
}; 

void BaseDatagram::Decode(uint8_t * buffer) 
{ 
    switch(buffer[DATAGRAM_TYPE]) 
    { 
     case DATAGRAM_TYPE_A: 
      Decode(buffer); // How to call decode in DerivedDatagramA? 
      break; 
     case DATAGRAM_TYPE_B: 
      Decode(buffer); // How to call decode in DerivedDatagramB? 
      break; 
+2

Вам не нужно наследование здесь (и вы хотите его по-другому). Make' BaseDatagram диспетчер для датаграмм (Than BaseDatagram больше не является датаграммой). –

ответ

2

Объявляет BaseDatagram::Decode(uint8_t*) как виртуальные, и вызов Decode() будет отправлен в DerivedDatagramA::Decode(uint8_t*) или DerivedDatagramB::Decode(uint8_t*) автоматически в зависимости от типа объекта.

+0

Хотя это имеет смысл вообще, из опубликованного кода не очевидно, что * любые * объекты производных типов даже когда-либо созданы. – dxiv

+0

Да. Создаются производные объекты. – jacknad

+0

Я знаю, как объявить виртуальный метод, но до сих пор неясно, как называется соответствующий объект. В подписи нет разницы. «Buffer [DATAGRAM_TYPE]» указывает, как датаграмма должна быть расшифрована. Я мог бы использовать разные имена, но в базовом классе есть другие общие функции (crc, ack id). Есть ли проблема с использованием подхода, упомянутого в комментарии от @ DieterLücking? – jacknad

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