我想问你一个类的虚函数表的偏移量依赖于什么?我的意思是,从我所读到的内容来看,它至少取决于编译器,但它会因类而异吗?
编辑:这里的偏移量指的是表相对于所有者对象地址的位置。
编辑:示例代码:
void **vtable = *((void***)(((char*)object)+offset));
int **ivtable=(int **)vtable;
void* firstFunction = (void*) ivtable[0];发布于 2010-01-25 21:18:34
当然,这依赖于确切的类。
请记住,C++具有多重继承(MI)。MI的结果是单个对象可能有多个基本子对象。当然,它们不能在同一地址。这也意味着某些基本子对象实际上不会从相对偏移0开始。
现在,这个MI为vtables引入了相当多的复杂性:你可以在不同的偏移量上从多个库中继承函数。因此,对MI类使用不同的vtable布局是很常见的。
在相关的注释中,MI还意味着并不是每个指向对象的指针实际上都是指向该对象开头的指针。指向Derived对象的SecondBase*指针很可能被sizeof(FirstBase)偏移,即指向Derived对象中间的某个地方。
发布于 2010-01-24 12:00:07
事实证明,Windows平台上的大多数/所有C++编译器都使用相同的虚拟函数表布局。微软COM技术的设计者利用了这一事实,以便可以在所有标准的Windows C++编译器上编译COM接口的C++实现。
我没有记住确切的顺序,但它基本上归结为对象图上的深度优先左递归,因此最左边的第一个声明的虚方法(如果使用多重继承,第一个声明),最深的派生类是表中的第一个虚方法。不过,我不知道“虚拟”继承(在基类的声明中使用virtual关键字)是否是标准化的。
发布于 2010-01-24 22:13:36
它随班级的不同而不同。
https://stackoverflow.com/questions/2125862
复制相似问题