vptr --虚拟表指针
vtbl --虚拟表
问题1> vptr与类的对象相关联是正确的吗?
问题2>将vtbl与类关联是否正确?
问题3>他们是如何真正协同工作的?
谢谢
发布于 2011-03-29 13:26:55
请注意,vptr和vtbl是实现定义的,C++标准甚至没有讨论它们。然而,大多数已知的编译器通过vptr和vtbl实现动态分派。
问题1: vptr 与类的对象关联是正确的吗?
是的
vptr与包含Atleast one虚拟成员函数的类的对象相关联。编译器将this指针的前4个字节添加到类的每个Polymorphic对象(包含至少一个虚拟成员函数),然后指向vptr
问题2: vtbl 与类关联是正确的吗?
是的
Vtbl与类相关联。为每个Polymorphic类创建一个vtbl。
问题3:它们是如何真正协同工作的?
编译器为多态类的每个对象添加一个vptr,并为每个类创建一个vtbl。vptr指向vtbl。vtbl包含该类中所有虚函数的地址列表。如果派生类覆盖了基类的虚函数,则vtbl中该特定函数的地址条目将替换为被覆盖函数的地址。在运行时,编译器根据指针内部的地址而不是指针的类型遍历特定类(基类或派生类)的vtbl,并调用vtbl中的函数地址。从而实现了动态多态性。
这种动态多态性的代价是:
fetch(获取其中的vptr )fetch(从vtbl中的函数列表获取函数地址)Call(调用函数)
相对于call(自静态绑定以来直接调用函数)。
发布于 2011-03-29 12:46:14
虚拟表指针只是类的每个对象中的一个指针,指向正确的虚拟表。在虚拟表中是类的虚拟函数的地址。当通过基类指针调用函数时,编译器遍历虚拟表以获取正确的函数。
https://stackoverflow.com/questions/5467956
复制相似问题