绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。绑定是在编译时进行的,叫作静态绑定,也叫做静态联编。动态绑定(动态联编/运行时绑定)则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。
(1)在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定,所以说虚函数是动态绑定的基础。
(2)动态绑定是和类的继承以及多态相联系的,在继承关系中,子类是父类的-一个特例,所以父类对象可以出现的地方,子类对象也可以出现。因此在运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。
(3)使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。
(4)动态联编要通过对象指针或对象引用来操作虚函数;如果采用对象来操作虚函数,则采用静态联编方式调用虚函数。
Demo:
#include "iostream"
using namespace std;
//定义一个人类的虚基类human,两个子类man、woman。
class Human
{
public:
Human(){}
~Human(){}
virtual void wearClothes()
//void wearClothes()
{
printf("I don't know what to wear!\n");
}
private:
int age;
char name[32];
};
class Man:public Human
{
public:
Man(){}
~Man(){}
void wearClothes()
{
printf("Man should wear pants!\n");
}
};
class Woman :public Human
{
public:
Woman() {}
~Woman() {}
void wearClothes()
{
printf("Woman should wear a skirt!\n");
}
};
void wear1(Human& people)
{
people.wearClothes();
}
void wear2(Human* people)
{
people->wearClothes();
}
void wear3(Human people)
{
people.wearClothes();
}
int main()
{
Human human1;
Woman girl;
Man boy1;
//静态绑定
wear1(human1);
wear1(girl);
wear1(boy1);
//静态绑定
wear2(&human1);
wear2(&girl);
wear2(&boy1);
//静态绑定
wear3(human1);
wear3(girl);
wear3(boy1);
return 0;
}