Я понимаю, что динамический/статический полиморфизм зависит от дизайна приложения и требований. Однако целесообразно ли ВСЕГДА выбрать статический полиморфизм по сравнению с динамическим, если это возможно? В частности, я вижу в своем приложении два варианта дизайна, оба из которых, как представляется, не рекомендуются:
-
Реализовать статический полиморфизм с использованием CRTP: нет служебных данных поиска vtable, все еще предоставляя интерфейс в виде базового класса шаблона. Но, использует много переключателей и static_cast для доступа к правильному классу/методу, который опасен
-
Динамический полиморфизм: реализация интерфейсов (чистых виртуальных классов), связывание стоимости поиска для даже тривиальных функций, таких как accessors/mutators
Мое приложение очень критично, поэтому я в пользу статического полиморфизма. Но нужно знать, является ли использование слишком большого количества static_cast показателем плохого дизайна и как избежать этого, не вызывая латентности.
EDIT: Спасибо за понимание. Принимая конкретный случай, какой из них лучше подходит?
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; }
...
}
Обратите внимание, что в каждом классе есть несколько мутаторов/аксессуаров, и мне нужно указать интерфейс в моем приложении. В статическом полиморфизме я переключаюсь только один раз - для получения типа сообщения. Однако в динамическом полиморфизме я использую виртуальные функции для вызова метода EACH. Разве это не значит использовать статический поли? Я считаю, что static_cast в CRTP вполне безопасен и не имеет ограничения по производительности (время компиляции)?