c++ - 编译时多态和运行时多态

标签 c++

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

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

最佳答案

是的,你是对的,在 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/

相关文章:

c++ - 具有多个主要功能的循环生成文件

c++ - C++ 中的函数范围异常处理——这是一种糟糕的风格吗?

c++ - C++中的运算符重载

c++ - 推力位移 vector

c++ - 将纹理转换为 GL_COMPRESSED_RGBA

c++ - CUDA 缺少 host_defines.h centos 7

c++ - 将模板专门化为嵌套类类型

c++ - VIM、自动格式化、代码指南、C++

c++ - 运行命令时 popen 的间隔是多少以及如何逐行捕获输出?

c++ - 复制构造函数