我了解动态/静态多态性取决于应用程序设计和要求。但是,是否建议始终选择静态多态性而不是动态多态性?特别是,我可以在应用程序中看到以下两种设计选择,但建议不要同时使用这两种选择:

  • 使用CRTP实现静态多态性:没有vtable查找开销,同时仍以模板基类的形式提供接口(interface)。但是,使用大量开关和static_cast来访问正确的类/方法,这是有害的
  • 动态多态性:实现接口(interface)(纯虚拟类),甚至为琐碎的函数(例如访问器/更改器(mutator))
  • 关联查找成本

    我的应用程序对时间很紧迫,因此我赞成使用静态多态性。但是需要知道是否使用过多的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表。

    10-08 14:24