C++ 动态绑定
编译器可以在运行时解析的绑定称为静态绑定。例如,所有的最终方法、静态方法和私有方法都是在运行时绑定的。所有重载的方法都使用静态绑定。
动态绑定的概念解决了静态绑定的问题。
动态绑定
绑定的一般含义是将某物连接到另一物。这里是将对象连接在一起。从编程角度来说,我们可以将绑定描述为将函数定义与函数调用相连。
所以动态绑定这个术语意味着在运行时选择特定的函数来运行。根据对象的类型,将调用相应的函数。
由于动态绑定提供灵活性,它避免了静态绑定的问题,因为静态绑定发生在编译时,并将函数调用与函数定义相连。
动态绑定的使用
除此之外,动态绑定还帮助我们使用单个函数名来处理不同的对象。它还降低了复杂性,并帮助开发人员调试代码和错误。
如何实现动态绑定?
动态编程的概念是通过虚函数来实现的。
虚函数
在基类中声明并在子类中重写(重新定义)的函数被称为虚函数。当我们使用指针或引用指向基类引用派生类对象时,我们可以为该对象调用虚函数并执行派生类的版本。
特征
- 运行时函数解析
- 用于实现运行时多态性
- 所有虚函数都声明在基类中
- 无论用于函数调用的指针(引用)是什么,都可以确保对一个对象调用正确的函数。
- 虚函数不能声明为静态函数
- 虚函数没有虚构造函数,但可以有虚析构函数。
- 虚函数的定义在基类中,派生类中进行重写。
- 虚函数可以是另一个类的友元。
现在让我们看一个没有虚关键字时会出现的问题。
示例
让我们以一个具有final_print()
函数的类A为例,类B公开继承A。B也有它自己的final_print()
函数。
如果我们创建一个A的对象并调用final_print()
,它将运行基类的函数,而如果我们创建一个B的对象并调用final_print()
,它将仍然运行基类的函数。
代码
#include
using namespace std;
class A {
public:
void final_print() // function that call display
{
display();
}
void display() // the display function
{
cout<< "Printing from the base class" <
输出
Printing from the base class
Printing from the base class
现在让我们使用虚函数来解决这个问题。
代码
#include
using namespace std;
class A {
public:
void final_print() // function that call display
{
display();
}
virtual void display() // the display function
{
cout<< "Printing from the base class" <
输出
Printing from the base class
Printing from the derived class
因此,动态绑定使用虚函数将函数调用与函数定义链接起来。