静态多态定义和实现

时间:2010-12-29 19:23:23

标签: c++ design-patterns language-agnostic static-polymorphism

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

  1. 我们如何定义一般的静态多态?作为一个例子,我相信来自C ++的std::sort函数应该被认为是静态多态的因为它依赖于一些表现得像迭代器的对象提供的接口,并且在编译时可以确定所提供的迭代器接口下的精确行为。这是解释我们如何定义静态多态,或者它只是对特定案例的描述,还有更多内容吗?

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

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

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

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:5)

  

我们如何定义静态多态性   总的来说?

使用示例了解它的最佳方式。 Policy Based Design是静态多态的一个例子。在我看来,这是实现静态多态的非常强大的技术。

另一个例子是Curiously recurring template pattern (CRTP),它也是一种强大的技术。

答案 2 :(得分:0)

  1. 否。除了模板之外,方法重载也是 - 静态多态。 https://en.wikipedia.org/wiki/Function_overloading