C ++ - vptr& vtbl与对象或类相关联?

时间:2011-03-29 04:39:38

标签: c++

vptr - 虚拟表指针

vtbl - 虚拟表

问题1> vptr与类的对象相关联是否正确?

问题2> vtbl与类相关联是否正确?

问题3>他们如何真正合作?

谢谢

2 个答案:

答案 0 :(得分:8)

请注意,vptrvtbl是实现定义的C ++标准甚至没有谈论它们。但是,大多数已知编译器通过vptrvtbl实现动态调度。

问题1:vptr与班级对象相关联是否正确?


vptr与包含Atleast one虚拟成员函数的Class的对象相关联。编译器将Vptr添加到类的每个对象Polymorphic(包含至少一个虚拟成员函数)。this指针的前4个字节然后指向vptr

问题2:vtbl与班级相关是否正确?


Vtbl与班级相关联。为每个vtbl类创建Polymorphic

问题3:他们如何真正合作?

编译器将vptr添加到Polymorphic类的每个对象,并为每个类创建vtblvptr指向vtblvtbl包含该类中所有虚函数的地址列表。如果派生类重写基类的虚函数,则vtbl中该特定函数的地址条目将被重写函数的地址替换。在运行时,编译器根据指针内的地址而不是指针类型遍历特定类(Base或Derived)的vtbl,并调用vtbl中的函数地址。因此实现了动态多态性 这种动态多态的成本是:
fetch(获取此内部的vptr)fetch(从vtbl中的函数列表中获取函数地址)Call(调用函数)

call相反(自静态绑定以来直接调用函数)。

答案 1 :(得分:3)

虚拟表指针只是类中每个对象的指针,指向正确的虚拟表。虚拟表内部是您的类的虚函数的地址。当通过基类指针调用函数时,编译器遍历虚拟表以获取正确的函数。