我了解动态/静态多态性取决于应用程序设计和要求。但是,是否建议始终选择静态多态性而不是动态多态性?特别是,我可以在应用程序中看到以下两种设计选择,但建议不要同时使用这两种选择:
我的应用程序对时间很紧迫,因此我赞成使用静态多态性。但是需要知道是否使用过多的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; }
...
}
请注意,每个类中都有多个更改器/访问器,并且我确实需要在应用程序中指定一个接口(interface)。在静态多态中,我只切换一次-获取消息类型。但是,在动态多态中,我将虚拟函数用于EACH方法调用。这样是否可以使用静态多边形?我相信CRTP中的static_cast是相当安全的,并且不会降低性能(编译时限)吗?
最佳答案
开关不过是一系列的跳转,经过优化后变成了表查找的地址跳转。就像虚拟函数调用一样。
如果必须根据类型跳转,则必须首先选择类型。如果选择不能在编译时完成(本质上是因为它取决于输入),则必须始终执行两个操作:select&jump。用于选择的语法工具不会改变性能,因为会对其进行优化。
实际上,您正在重新创建v表。