vptr - 虚拟表指针
vtbl - 虚拟表
问题1> vptr与类的对象相关联是否正确?
问题2> vtbl与类相关联是否正确?
问题3>他们如何真正合作?
谢谢
答案 0 :(得分:8)
请注意,vptr
和vtbl
是实现定义的C ++标准甚至没有谈论它们。但是,大多数已知编译器通过vptr
和vtbl
实现动态调度。
问题1:vptr
与班级对象相关联是否正确?
是强>
vptr
与包含Atleast one
虚拟成员函数的Class的对象相关联。编译器将Vptr添加到类的每个对象Polymorphic
(包含至少一个虚拟成员函数)。this
指针的前4个字节然后指向vptr
问题2:vtbl
与班级相关是否正确?
是强>
Vtbl
与班级相关联。为每个vtbl
类创建Polymorphic
。
问题3:他们如何真正合作?
编译器将vptr
添加到Polymorphic类的每个对象,并为每个类创建vtbl
。 vptr
指向vtbl
。 vtbl
包含该类中所有虚函数的地址列表。如果派生类重写基类的虚函数,则vtbl
中该特定函数的地址条目将被重写函数的地址替换。在运行时,编译器根据指针内的地址而不是指针类型遍历特定类(Base或Derived)的vtbl
,并调用vtbl
中的函数地址。因此实现了动态多态性
这种动态多态的成本是:
fetch
(获取此内部的vptr)fetch
(从vtbl中的函数列表中获取函数地址)Call
(调用函数)
与call
相反(自静态绑定以来直接调用函数)。
答案 1 :(得分:3)
虚拟表指针只是类中每个对象的指针,指向正确的虚拟表。虚拟表内部是您的类的虚函数的地址。当通过基类指针调用函数时,编译器遍历虚拟表以获取正确的函数。