C++ 动态绑定

2025年3月17日 | 阅读 3 分钟

编译器在运行时可以解析的绑定称为静态绑定。例如,所有 final、static 和 private 方法都在运行时绑定。所有重载方法都使用静态绑定绑定。

动态绑定的概念消除了静态绑定带来的问题。

Dynamic binding in C++

动态绑定

绑定的普遍含义是将某物连接到另一物。在这里,实现了对象的连接。在编程意义上,我们可以将绑定描述为将函数定义与函数调用关联起来。

因此,动态绑定一词意味着在运行时选择要运行的特定函数。根据对象的类型,将调用相应的函数。

由于动态绑定提供了灵活性,它避免了静态绑定在编译时发生的问题,从而将函数调用与函数定义关联起来。

动态绑定的使用

值得一提的是,动态绑定还帮助我们使用单个函数名称处理不同的对象。它还降低了复杂性,并帮助开发人员调试代码和错误。

如何实现动态绑定?

动态编程的概念是通过虚函数实现的。

虚函数

在基类中声明并在子类中被覆盖(重新定义)的函数称为虚函数。当我们使用指向基类的指针或引用来引用派生类对象时,我们可以为该对象调用虚函数并执行派生类版本的函数。

特性

  • 运行时函数解析
  • 用于实现运行时多态性
  • 所有虚函数都在基类中声明
  • 无论用于函数调用的指针(引用)如何,都确保为对象调用正确的函数。
  • 虚函数不能声明为 static
  • 不存在虚构造函数,但可以创建虚析构函数。
  • 虚函数定义在基类和派生类中应相同。
  • 虚函数可以是另一个类的友元。
  • 定义始终在基类中,并在派生类中重写

现在让我们看看在没有 virtual 关键字的情况下会发生以下问题。

示例

我们假设有一个类 A,其中有一个函数 final_print(),并且类 B 公共继承自 A。B 也有自己的 final_print() 函数。

如果我们创建 A 的对象并调用 final_print(),它将运行基类的版本,而如果我们创建 B 的对象并调用 final_print(),它将只运行基类的版本。

编码

输出

Printing from the base class
Printing from the base class    

现在让我们使用虚函数来解决这个问题。

编码

输出

Printing from the base class
Printing from the derived class   

因此,动态绑定借助虚函数将函数调用与函数定义关联起来。