28

我对我听说过的静态多态概念有一些疑问;您可能主要在 C++ 的上下文中解释它们,但我希望在适用的情况下使用与语言无关的答案(因此标记 C++ 和与语言无关的)。

  1. 我们一般如何定义静态多态性?例如,我认为std::sortC++ 中的函数应该被认为是静态多态的,因为它依赖于某些对象提供的某些接口,这些对象的行为类似于 iterators,并且提供的迭代器接口下的确切行为可以在编译时确定。这是我们如何定义静态多态性的解释,还是只是对特定情况的描述并且还有更多内容?

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

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

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

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

4

3 回答 3

14
  1. 静态多态行为是发生在编译时而不是运行时的类型多态。
  2. 是的。
  3. UML 是关于类在运行时如何交互的——我不相信有用于描述模板的 UML 格式,但我可能是错的。
  4. 据我所知,它是特定于 C++ 的,但我并不肯定,因为我没有使用过所有发明过的语言。:) 也就是说,像 C# 和 Java 这样的 JIT 语言在某些情况下使用在运行时而不是编译时收集的信息通常非常擅长消除间接调用的性能影响。不过,这是否在编译时有点悬而未决……毕竟,它被称为即时编译器
  5. 主要的好处就是性能。运行时多态可以做静态多态可以做的所有事情(实际上它可以做更多),但它带来了间接调用的成本(如果有足够多的它们,这可能会很昂贵)

现在,除了实现编译时多态性之外,模板本身还有许多用途——例如使boost::bind工作的 SFINAE 魔法肯定不是多态性的——它只是为了消除语言本身的不一致性而存在。

于 2010-12-29T19:39:07.737 回答
6

我们一般如何定义静态多态性?

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

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

于 2010-12-29T19:35:20.663 回答
0
  1. 不是。除了模板,方法重载也是——静态多态。 https://en.wikipedia.org/wiki/Function_overloading
于 2014-10-21T08:13:29.390 回答