今天被问及前后绑定,被问的懵逼。
1.绑定:函数体和函数调用关联起来
2.早绑定/静态绑定:在程序执行之前,程序编译阶段就确定的绑定。优点是效率高、编译器会帮你检查。非虚函数、静态函数都属于静态绑定。
3.晚绑定/动态绑定:虚函数的存在,使得在程序执行的时候才确定的绑定,优点是不用申明类型,运行时方便修改。编译器为包含虚函数的类创建虚函数表(VTABLE),在表中放在各个虚函数对应的地址。在每个带有虚函数的类中,都带有一个VPTR指针,指向VTABLE。当用基类指针调用虚函数时,编译器静态的插入代码,获得VPTR并在VTABLE中查表得到对应函数地址,这样实现动态绑定。
4.关于虚函数表
1)虚函数表是类关联的,就是i说一个类只有一个VTABLE
2)VTABLE中函数的位置是由基类的的顺序决定的,子类中重写的顺序不影响它的虚函数表
3)VPTR是对象关联的,不同的对象的VPTR是相同的,都执行虚函数表
4)VPTR是在构造函数阶段初始化的。