我想问一下,类的虚函数表的偏移量取决于什么?我的意思是,从我读到的内容来看,它至少取决于编译器,但它是否因类而异?
编辑:通过偏移我的意思是表相对于所有者对象的地址的位置。
编辑:示例代码:
void **vtable = *((void***)(((char*)object)+offset));
int **ivtable=(int **)vtable;
void* firstFunction = (void*) ivtable[0];
当然,这对具体的类有依赖性。
请记住,C++ 具有多重继承 (MI)。 MI 的结果是单个对象可能有多个基础子对象。这些当然不能位于同一地址。这也意味着某些基础子对象实际上并不从相对偏移量 0 开始。
现在,这个 MI 引入了相当多的 vtable 复杂性:您从多个基点、不同的偏移量继承函数。因此,对 MI 类使用不同的 vtable 布局是很常见的。
与此相关的是,MI 还意味着并非每个指向对象的指针实际上都是指向的开始那个物体。很有可能SecondBase*
指向一个的指针Derived
对象偏移量为sizeof(FirstBase)
,即指向中间的某个位置Derived
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)