Я понимаю, что динамический/статический полиморфизм зависит от дизайна приложения и требований. Однако целесообразно ли ВСЕГДА выбрать статический полиморфизм по сравнению с динамическим, если это возможно? В частности, я не вижу следующий выбор 2 дизайн в моем приложении, оба из которых, как представляется, не рекомендуемые:Dyamic vs Static Polymorphism в C++: что предпочтительнее?
Реализация статического полиморфизма с использованием CRTP: Нет виртуальные таблицы накладных расходов подстановок, обеспечивая при этом интерфейс в виде шаблона базовый класс. Но, использует Лот переключателя и static_cast для доступа правильного класса/метода, который является опасной
Динамического полиморфизмом: Реализовать интерфейсы (чисто виртуальные классы), связывая стоимость поиска для даже тривиальных функций, таких как Accessors/мутаторы
Мое приложение очень критично, поэтому я в пользу статического полиморфизма. Но нужно знать, является ли использование слишком большого количества 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 вполне безопасен и не влияет на производительность (привязка времени компиляции)?
Структура коммутационного шкафа имеет ту же сложность, что и при использовании vtable. – user877329
Я не уверен, почему вы думаете, что в конечном итоге вы получаете много static_cast и переключатели при использовании статического полиморфизма - можете ли вы показать примерный код? –
@MichaelAnderson: Вы получите это, если попытаетесь использовать статический полиморфизм в ситуации, требующей динамического полиморфизма. В этом случае почти наверняка лучше использовать динамический полиморфизм, а не пытаться изобрести его. –