静态多态定义和实现

Kos*_*Kos 28 c++ language-agnostic design-patterns static-polymorphism

关于静态多态性的概念我有些疑问,我有些时候会听到; 您可能主要在C++的上下文中解释它们,但我会欣赏适用的语言无关的答案(因此标记C++和语言不可知).

  1. 我们如何定义静态多态?作为一个例子,我相信,std::sort因为它取决于由一些对象,其提供了一些接口上从C++函数应被视为静态多态性表现得像迭代器,并且提供迭代器的接口下确切行为可在编译时被确定.这是解释我们如何定义静态多态,或者它只是对特定案例的描述,还有更多内容吗?

  2. 在C++中使用静态多态的常见代码模式是什么?另外:SP 只能通过C++中的模板实现吗?

  3. 这是真的,一个给定的UML类图不直接描述多态性是如何处理的,因此,它可以被至少部分地或者静态地或者动态地执行?换句话说:静态与动态多态的选择是否独立于OOP模型,因此由实现者决定?

  4. 静态多态只是C++特定的并且与模板的工作方式有关吗?如果没有,它是否存在于C++以外的任何其他主流语言中?我们可以在Java,C#中拥有等效的静态多态性吗?任何东西,它会带来什么好处吗?

  5. 最重要的...... 使用静态多态性的实际好处是什么?我认为我们可以同意它降低了代码的灵活性; 有什么优点,除了 - 在C++的情况下 - 保存一个指针解除引用(虚函数/指针到函数/委托成本)?什么是静态多态性特别有用的问题类,是实现的正确选择?

Bil*_*eal 13

  1. 静态多态行为是在编译时而不是运行时发生的类型多态.
  2. 是.
  3. UML是关于类在运行时如何交互的 - 我不相信有用于描述模板的UML格式,但我可能是错的.
  4. 据我所知,它是C++特定的,但鉴于我没有使用过所有发明过的语言,我并不积极.:)尽管如此,JIT的语言如C#和Java在某些情况下使用在运行时收集的信息而不是在编译时通常非常擅长消除间接调用的性能影响.无论是在编译时还是在编辑时,它都有点直播......毕竟,它被称为即时编译器.
  5. 主要好处是简单的表现.运行时多态可以做静态多态可以做的所有事情(事实上它可以做更多),但是它带有间接调用的成本(如果有足够的话,这可能很昂贵)

现在,模板本身除了实现编译时多态之外还有许多用途 - 例如,SFINAE魔术使得boost::bind工作肯定不是多态的 - 它仅仅是为了平滑语言本身的不一致性.

  • "2.是的." 函数重载怎么样? (3认同)

Naw*_*waz 5

我们如何定义静态多态?

使用示例了解它的最佳方式.基于策略的设计是静态多态的一个例子.在我看来,它是实现静态多态的非常强大的技术.

另一个例子是,奇怪的重复模板模式(CRTP),这也是一种强大的技术.