2016-07-12 6 views
-1

この質問は恐らくthisと重複していますが、私の回答がアプリケーションにどのように当てはまるのか分かりません。私は複数の派生クラスを持つ基本クラスを持っています。クラスメソッドはすべて同じ名前を持つ必要があります。アプリケーションは、データグラムタイプに基づいて異なる方法でデコードする必要があるUDPメッセージを受信します。たとえば、DerivedDatagramAまたはDerivedDatagramBのDecodeを呼び出すために、BaseDatagramのDecodeをどのように行うことができますか?派生したメソッドを基底から呼び出す方法

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

ここでは継承を望んでいません(別のやり方でやりたがります)。 BaseDatagramをデータグラム用のディスパッチャにします(BaseDatagramよりもDatagramはありません)。 –

答えて

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

関連する問題