我注意到某处多态性只是指虚函数。但是,它们在某处包括函数重载和模板。后来发现有两个名词,编译时多态和运行时多态。真的吗?
我的问题是,当我们普遍谈论多态性时,被广泛接受的含义是什么?
原文由 skydoor 发布,翻译遵循 CC BY-SA 4.0 许可协议
我注意到某处多态性只是指虚函数。但是,它们在某处包括函数重载和模板。后来发现有两个名词,编译时多态和运行时多态。真的吗?
我的问题是,当我们普遍谈论多态性时,被广泛接受的含义是什么?
原文由 skydoor 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答1.3k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答859 阅读
1 回答929 阅读
1 回答965 阅读
1 回答730 阅读
1 回答831 阅读
是的,你是对的,在 C++ 中有两种公认的多态性“类型”。他们的意思和你想的差不多
动态多态性
是 C#/Java/OOP 人们通常简称为“多态性”的东西。它本质上是子类化,或者从基类派生并覆盖一个或多个虚函数,或者实现一个接口。 (在 C++ 中是通过覆盖属于抽象基类的虚函数来完成的)
静态多态性
发生在编译时,并且可以被认为是鸭式的变体。这里的想法很简单,尽管完全不相关,但可以在函数中使用不同的类型来表示相同的概念。对于一个非常简单的例子,考虑这个
如果这是动态多态性,那么我们将定义
add
函数以将某种“IAddable”对象作为其参数。任何实现该接口(或从该基类派生)的对象都可以使用,尽管它们的实现不同,这为我们提供了多态行为。我们不关心传递给我们的是哪种类型,只要它实现了某种“可以加在一起”的接口即可。但是,编译器实际上并不 知道 传递给函数的类型。确切的类型仅在运行时才知道,因此这是 动态 多态性。但是,在这里,我们不要求您从任何东西派生,类型
T
只需定义+
运算符。然后 静态 插入。所以在编译时,我们可以在任何有效类型之间切换,只要它们 行为 相同(意味着它们定义了我们需要的成员)这是另一种形式的多态性。原则上,效果是一样的:该函数适用于我们感兴趣的概念的任何实现。我们不关心我们处理的对象是字符串、整数、浮点数还是复数,因为只要它实现了“可以相加”的 _概念_。
由于使用的类型是静态已知的(在编译时),这称为静态多态性。而实现静态多态的方式是通过模板和函数重载。
但是,当 C++ 程序员 只 说多态性时,他们通常指的是动态/运行时多态性。
(请注意,这不一定适用于所有语言。函数式程序员在使用该术语时通常会表示静态多态性之类的东西——使用某种参数化类型定义泛型函数的能力,类似于模板)