首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚函数表偏移量

虚函数表偏移量
EN

Stack Overflow用户
提问于 2010-01-24 11:52:18
回答 3查看 3.6K关注 0票数 3

我想问你一个类的虚函数表的偏移量依赖于什么?我的意思是,从我所读到的内容来看,它至少取决于编译器,但它会因类而异吗?

编辑:这里的偏移量指的是表相对于所有者对象地址的位置。

编辑:示例代码:

代码语言:javascript
复制
void **vtable = *((void***)(((char*)object)+offset));

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

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-25 21:18:34

当然,这依赖于确切的类。

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2010-01-24 12:00:07

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-24 22:13:36

它随班级的不同而不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2125862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档