vptr-虚拟表指针
vtbl-虚拟表
问题1> vptr与类的对象相关联是否正确?
问题2>将vtbl与该类相关联是否正确?
问题3>他们如何真正合作?
谢谢
最佳答案
请注意,vptr
和vtbl
是实现定义的,C++标准甚至没有谈论它们。但是,大多数已知的编译器通过vptr
和vtbl
实现动态调度。
问题1:vptr
与类的对象相关联是否正确?
是vptr
与包含Atleast one
虚拟成员函数的Class对象相关联。编译器将Vptr添加到是Polymorphic
的Class的每个对象中(包含至少一个虚拟成员函数)this
指针的前4个字节,然后指向vptr
问题2:vtbl
与该类相关联是否正确?
是Vtbl
与一个类相关联。为每个vtbl
类创建一个Polymorphic
。
问题3:它们如何真正协同工作?
编译器将vptr
添加到Polymorphic类的每个对象中,并且还为该类的每个对象创建vtbl
。 vptr
指向vtbl
。 vtbl
包含该类中所有虚拟函数的地址列表。如果派生类覆盖基类的虚函数,则vtbl
中该特定函数的地址条目将被覆盖函数的地址替换。在运行时,编译器根据指针内部的地址(而不是指针的类型)遍历特定类(基本或派生)的vtbl
,并在vtbl
中调用函数地址。这样就实现了动态多态。
这种动态多态性的成本为:fetch
(在其中获取vptr)fetch
(从vtbl中的函数列表获取函数地址)Call
(调用函数)
与call
相对(自静态绑定(bind)以来直接调用函数)。
关于c++ - C++ —与对象或类关联的vptr和vtable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5467956/