关于虚表、虚指针的具体实现方法,结合其他的人的观点,总结如下:
动态绑定的实现机制(三步)
1.在非虚继承中,为每一个包含虚函数的类设置一个虚表(VTABLE)每当创建一个包含有虚函数的类或从包含
虚函数的类派生一个 类的对象时,编译器就会为这个类创建一个VTABLE。在VTABLE中,编译器放置了这个
类(或者它的基类)中所有已经声明为 virtual的函数的地址。如果在这个派生类中没有对基类中声明为 virtual 的
函数进行重新定义,编译器就使用基类的这个虚函数的地址。而且 所有VTABLE中虚函数地址的顺序是完全相
同的;
而在虚继承中,派生类对象中派生类的部分和基类的部分拥有各自的虚表,相应的派生类对象既需要有自己的
虚指针又需要有基类部分的虚指针,同时为了实现虚继承,还需加入一个虚类指针指向父类对象,所以实现了
虚继承的子类对象占用的空间应该为
sizeof(父类) + 4(指向父类的虚类指针)+ 4(派生类的虚指针,如果有的话) +
派生类自身成员变量占用空间(这里要考虑编译器的数据对齐,编译器一般以4的倍数对齐)
2.初始化虚指针(VPTR)
然后编译器在这个类的各个对象中放置VPTR。VPTR在对象的相同的位置(通常都在对象的开头)。VPTR必
须被初始化为指向相应的VTABLE。
3.为虚函数调用插入代码
当通过基类的指针调用派生类的虚函数时,编译器将在调用处插入相应的代码,以实现通过VPTR找到VTABLE,
并根据VTABLE中存储的正确的虚函数地址,访问到正确的函数。