虚函数表偏移量

时间:2010-01-24 03:52:18

标签: c++ function virtual

我想问一下,一个类的虚函数表的偏移量取决于什么?我的意思是,从我读过的内容来看,它至少取决于编译器,但它是否因类不同而不同?

编辑:按偏移量我的意思是表格相对于所有者对象地址的位置。

编辑:示例代码:

void **vtable = *((void***)(((char*)object)+offset));

int **ivtable=(int **)vtable;

void* firstFunction = (void*) ivtable[0];

3 个答案:

答案 0 :(得分:4)

肯定依赖于确切的类。

请记住,C ++具有多重继承(MI)。 MI的结果是单个对象可能具有多个基础子对象。那些当然不能在同一个地址。这也意味着一些基础子对象实际上并不以相对偏移量0开始。

现在,这个MI在vtable中引入了相当多的复杂性:你在不同的偏移量下从多个基础继承函数。因此,为MI类使用不同的vtable布局是很常见的。

在相关的说明中,MI还意味着并非每个指向对象的指针实际上都是指向 该对象的开头的指针。指向SecondBase*对象的Derived指针很可能被sizeof(FirstBase)偏移,即指向Derived对象中间的某个位置。

答案 1 :(得分:3)

事实证明,Windows平台上的大多数/所有C ++编译器都使用相同的虚函数表布局。微软COM技术的设计者利用了这一事实,以便可以在所有标准的Windows C ++编译器上编译COM接口的C ++实现。

我没有记住确切的顺序,但它基本上归结为对象图上的深度优先左递归,因此最左边的第一个声明的虚方法(如果使用多继承,则声明为1st ),最深的派生类是表中的第一个虚方法。我不知道“虚拟”继承(使用基类声明中的虚拟关键字)是否已标准化。

答案 2 :(得分:0)

因班级而异。