编译时多态性和运行时多态性

新手上路,请多包涵

我注意到某处多态性只是指虚函数。但是,它们在某处包括函数重载和模板。后来发现有两个名词,编译时多态和运行时多态。真的吗?

我的问题是,当我们普遍谈论多态性时,被广泛接受的含义是什么?

原文由 skydoor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 979
2 个回答

是的,你是对的,在 C++ 中有两种公认的多态性“类型”。他们的意思和你想的差不多

动态多态性

是 C#/Java/OOP 人们通常简称为“多态性”的东西。它本质上是子类化,或者从基类派生并覆盖一个或多个虚函数,或者实现一个接口。 (在 C++ 中是通过覆盖属于抽象基类的虚函数来完成的)

静态多态性

发生在编译时,并且可以被认为是鸭式的变体。这里的想法很简单,尽管完全不相关,但可以在函数中使用不同的类型来表示相同的概念。对于一个非常简单的例子,考虑这个

template <typename T>
T add(const T& lhs, const T& rhs) { return lhs + rhs; }

如果这是动态多态性,那么我们将定义 add 函数以将某种“IAddable”对象作为其参数。任何实现该接口(或从该基类派生)的对象都可以使用,尽管它们的实现不同,这为我们提供了多态行为。我们不关心传递给我们的是哪种类型,只要它实现了某种“可以加在一起”的接口即可。但是,编译器实际上并不 知道 传递给函数的类型。确切的类型仅在运行时才知道,因此这是 动态 多态性。

但是,在这里,我们不要求您从任何东西派生,类型 T 只需定义 + 运算符。然后 静态 插入。所以在编译时,我们可以在任何有效类型之间切换,只要它们 行为 相同(意味着它们定义了我们需要的成员)

这是另一种形式的多态性。原则上,效果是一样的:该函数适用于我们感兴趣的概念的任何实现。我们不关心我们处理的对象是字符串、整数、浮点数还是复数,因为只要它实现了“可以相加”的 _概念_。

由于使用的类型是静态已知的(在编译时),这称为静态多态性。而实现静态多态的方式是通过模板和函数重载。

但是,当 C++ 程序员 说多态性时,他们通常指的是动态/运行时多态性。

(请注意,这不一定适用于所有语言。函数式程序员在使用该术语时通常会表示静态多态性之类的东西——使用某种参数化类型定义泛型函数的能力,类似于模板)

原文由 jalf 发布,翻译遵循 CC BY-SA 2.5 许可协议

根据我的经验,通常人们指的是运行时多态性……

原文由 Goz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题