、私はリストを反復するinstruments
とコールdoPiano()
iffカー楽器はピアノでギターの場合はdoGuitar()
です。これらの2つの機能は大きく異なり、クラスInstrument
では抽象的にすることはできません。C++多重ディスパッチ
問題は、C++は実行時にInstrument
の型を識別できないことです(単一ディスパッチのため)。イテレータが指している現在のタイプに応じて、ピアノまたはギター機能を呼び出す方法をどのように達成できますか?
私はsthを実装できたらうれしいです。この擬似コードのような作業:
list<shared_ptr<Instrument>>::const_iterator it;
if ("current type == Guitar")
(*it)->doGuitar();
else if ("current type == Piano")
(*it)->doPiano();
結果
実は、私は私のアプローチにはいくつかの問題に遭遇しました。私はこの投稿を使って多くのリファクタリングを行った:How does one downcast a std::shared_ptr?。あなたの助けを借りてありがとう:
なぜ、単に正しいことをする仮想 'do'関数がないのですか? –
は 'std :: dynamic_pointer_cast'を見ています。その後、あなたのデザインをリッピングして、もう一度やり直してください。多態性は、すべての派生クラスが同じインタフェースを合理的に共有できる場合にのみ適しています。 –
実際、私の例は私の「本当の」実装のほんの一部です。 'Instrument'にはいくつかの純粋な仮想関数があります。私はそれを言及すべきだった。 – Kapa11