動的/静的ポリモーフィズムは、アプリケーションの設計と要件に依存することを理解しています。ただし、可能であれば、動的ではなく静的ポリモーフィズムを常に選択することをお勧めしますか?特に、私のアプリケーションでは次の2つの設計上の選択を見ることができますが、どちらも推奨されていないようです。
CRTPを使用して静的ポリモーフィズムを実装します。テンプレート基本クラスの形式でインターフェイスを提供しながら、vtableルックアップのオーバーヘッドはありません。ただし、多くのスイッチとstatic_castを使用して、正しいクラス/メソッドにアクセスします。これは危険です。
動的ポリモーフィズム:インターフェース(純粋仮想クラス)を実装し、アクセサー/ミューテーターのような些細な関数でもルックアップコストを関連付けます
私のアプリケーションは非常にタイムクリティカルなので、静的ポリモーフィズムを支持しています。ただし、static_castの使用が多すぎることが設計が不十分であることを示しているかどうか、および遅延を発生させずにそれを回避する方法を知る必要があります。
編集:洞察に感謝します。特定のケースを取り上げると、これらのどれがより良いアプローチですか?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
また
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
各クラスにはいくつかのミューテーター/アクセサーがあり、アプリケーションでインターフェースを指定する必要があることに注意してください。静的ポリモーフィズムでは、メッセージタイプを取得するために一度だけ切り替えます。ただし、動的ポリモーフィズムでは、各メソッド呼び出しに仮想関数を使用しています。それは静的ポリを使用する場合にはなりませんか?CRTPのstatic_castは非常に安全で、パフォーマンスの低下(コンパイル時の制限)はないと思いますか?