我需要对 C++ 中的动态绑定进行一些澄清。我对以下内容感到困惑:
在 C 中,您可以拥有一个函数指针数组并分配具有相同签名的不同函数并根据索引调用它们;这是动态绑定吗?
在 C++ 中,您可以拥有一个基类指针数组,但您可以调用派生类的不同函数,通过将派生类对象地址分配给基类指针数组并使用虚函数,这是动态绑定吗?
哪个术语是正确的 -
Dynamic binding
或Link-Time Binding
?
我需要对 C++ 中的动态绑定进行一些澄清。我对以下内容感到困惑:
在 C 中,您可以拥有一个函数指针数组并分配具有相同签名的不同函数并根据索引调用它们;这是动态绑定吗?
在 C++ 中,您可以拥有一个基类指针数组,但您可以调用派生类的不同函数,通过将派生类对象地址分配给基类指针数组并使用虚函数,这是动态绑定吗?
哪个术语是正确的 -Dynamic binding
或Link-Time Binding
?
答案
我将这两种用法都称为动态绑定。在 C++ 中,语言为您提供了机制,因此您不必像在 C 中那样自行开发。
(我曾经使用过一个应用程序,其中每个主要对象都伴随着一个struct
其字段是函数指针的传递。结构的目的是允许应用程序实现运行时动态绑定 - 即更改分配的函数对象在运行时,取决于对象的状态。据我所知,这个“功能”从未被利用过。)
动态绑定是在运行时将接口绑定到其实现 - 程序自动决定调用哪些代码作为接口实现的任何情况。所以一般来说1)和2)都是动态绑定,但是这个词通常只用于2)。
链接时绑定(又名早期绑定)与动态绑定(又名后期绑定)相反。在链接时绑定中,编译器/链接器确切地知道要调用什么代码并直接调用该代码。在动态绑定中,编译器/链接器不知道——确切的实现是在运行时确定的。
您是否尝试过用 C 语言编写代码?您为此使用了哪个编译器?C 语言中不能有两个同名的函数。
您将动态绑定的概念与实现混淆了。动态绑定,即根据接收对象的类型选择调用哪个方法,可以使用某种形式的动态调度来实现,即你的(1),但我们一般定义名称只指情况(2)。