vptr-虚拟表指针

vtbl-虚拟表

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

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

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

谢谢

最佳答案

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

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

vptr与包含Atleast one虚拟成员函数的Class对象相关联。编译器将Vptr添加到是Polymorphic的Class的每个对象中(包含至少一个虚拟成员函数)this指针的前4个字节,然后指向vptr
问题2:vtbl与该类相关联是否正确?

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

问题3:它们如何真正协同工作?

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

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

关于c++ - C++ —与对象或类关联的vptr和vtable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5467956/

10-12 18:23