2016-07-12 21 views
-1

Diese Frage ist möglicherweise ein Duplikat von this, aber ich verstehe nicht, wie die Antwort auf meine Anwendung zutrifft. Ich habe eine Basisklasse mit mehreren abgeleiteten Klassen. Die Klassenmethoden sollten alle den gleichen Namen haben. Die Anwendung empfängt UDP-Nachrichten, die basierend auf dem Datagrammtyp unterschiedlich dekodiert werden müssen. Zum Beispiel, wie kann Decode in BaseDatagram gemacht werden, um Decode in DerivedDatagramA oder DerivedDatagramB aufzurufen?So rufen Sie die abgeleitete Methode von der Basis

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

Sie wollen hier keine Vererbung (und Sie wollen es auf eine andere Weise). Make 'BaseDatagram ein Dispatcher für Datagramme (als BaseDatagram ist kein Datagramm mehr). –

Antwort

2

BaseDatagram::Decode(uint8_t*) als virtuelles Deklarieren, und der Anruf an Decode() wird DerivedDatagramA::Decode(uint8_t*) oder DerivedDatagramB::Decode(uint8_t*) gemäß dem Objekttyp automatisch versandt werden.

+0

Während dies im Allgemeinen Sinn macht, ist es aus dem geposteten Code nicht offensichtlich, dass * irgendwelche * Objekte abgeleiteter Typen überhaupt erzeugt werden. – dxiv

+0

Ja. Die abgeleiteten Objekte werden erstellt. – jacknad

+0

Ich weiß, wie man eine virtuelle Methode deklariert, aber es ist immer noch nicht klar, wie das richtige Objekt aufgerufen wird. Es gibt keinen Unterschied in der Signatur. Der 'buffer [DATAGRAM_TYPE]' gibt an, wie das Datagramm decodiert werden soll. Ich könnte verschiedene Namen verwenden, aber es gibt andere gemeinsame Merkmale in der Basisklasse (crc, ack id). Gibt es Probleme mit dem im Kommentar von @ DieterLücking genannten Ansatz? – jacknad