说早绑定和晚绑定的时候,先来看看绑定的意思吧。
绑定的英文名为binding:把函数体和函数调用相联系称为绑定。
类中的一般的函数都是早绑定,也就是说:在调用的地方,就已经把要调用的函数确定好了,调用的类就是定义它的类。现在的“向上映射”就会导致早绑定的问题:
代码:
#include<iostream>
using namespace std;
class A{
int a;
public :
A(){a=0;}
void print(){cout<<”A-father”<<endl;}
};
class A1:public A{
int a;
public :
A(){a=0;}
void print(){cout<<”A1-children”<<endl;}
};
void print(A& i){
i.print();
};
void main(){
A& a = new A1;
print(a);
}
上面就是早绑定的例子,得到的输出也是:A-father,原理和简单,首先i.print()的时候,就与类型为A的printf()函数绑定了,所以自然调用的是A中的函数啦。现在我们来说下晚绑定:
我们现在在A中的printf()前面加上vitrual,这样就变成了虚函数啦,也就是晚绑定啦,来卡看它的实现:
同样,i.print()的时候去找A中的函数,但是发现函数是虚拟的,所以去其指向的对象中找vtpr指针,然后找vptr中找其函数(原理见think in c++中的14章,多态与虚函数),然后这样实现晚绑定。
在实验中:发现了类中的函数地址是没有的,以及一般的函数地址就是函数名,但是要强制类型转换。