我注意到多态性在某处仅指虚函数。但是,它们在某处包含函数重载和模板。后来发现有两个名词,编译时多态和运行时多态。真的吗?
我的问题是,当我们普遍谈论多态性时,广泛接受的含义是什么?
最佳答案
是的,你是对的,在 C++ 中有两种公认的多态“类型”。他们的意思和你想的差不多
动态多态
是 C#/Java/OOP 人们通常简称为“多态性”的东西。它本质上是子类化,要么从基类派生并覆盖一个或多个虚函数,要么实现一个接口(interface)。 (这在 C++ 中是通过覆盖属于抽象基类的虚函数来完成的)
静态多态
发生在编译时,可以被认为是 ducktyping 的一种变体。这里的想法很简单,尽管完全不相关,但可以在一个函数中使用不同的类型来表示相同的概念。举一个非常简单的例子,考虑这个
template <typename T>
T add(const T& lhs, const T& rhs) { return lhs + rhs; }
如果这是动态多态性,那么我们将定义 add
函数以将某种“IAddable”对象作为其参数。任何实现该接口(interface)(或从该基类派生)的对象都可以使用,尽管它们的实现不同,这为我们提供了多态行为。我们不关心传递给我们的是哪种类型,只要它实现了某种“可以相加”的接口(interface)即可。
但是,编译器实际上不知道传递给函数的是哪种类型。确切的类型只有在运行时才知道,因此这是动态多态性。
不过,在这里,我们不要求您从任何东西派生,T
类型只需要定义 +
运算符。然后它被静态地插入。因此在编译时,我们可以在任何有效类型之间切换,只要它们行为相同(意味着它们定义了我们需要的成员)
这是多态的另一种形式。原则上,效果是一样的:该函数适用于我们感兴趣的概念的任何实现。我们不关心我们处理的对象是字符串、整数、 float 还是复数,因为只要它实现了“可以加在一起”概念。
由于所使用的类型是静态已知的(在编译时),这被称为静态多态性。而静态多态的实现方式是通过模板和函数重载。
但是,当 C++ 程序员只是说多态时,他们通常指的是动态/运行时多态。
(请注意,这不一定适用于所有语言。函数式程序员在使用该术语时通常指的是静态多态性之类的东西——使用某种参数化类型定义通用函数的能力,类似于模板)
关于c++ - 编译时多态和运行时多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128838/