首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vptr是否曾经不位于对象的开头?

vptr是否曾经不位于对象的开头?
EN

Stack Overflow用户
提问于 2012-09-19 21:15:04
回答 3查看 1.5K关注 0票数 3

根据MSDN的规定,在Visual C++中使用__RTDynamicCast() function实现dynamic_cast。它的一个参数是LONG VfDelta,它被描述为“对象中虚函数指针的偏移量”。

vptr始终位于对象的起始处,因此偏移将始终为零。我仔细研究过使用dynamic_cast反汇编各种代码片段,除了在这个参数的位置传递零之外,我从来没有看到过任何东西。

vptr是否位于对象开始之外的任何位置?这个偏移量可以不是零吗?

EN

回答 3

Stack Overflow用户

发布于 2012-09-19 21:17:56

在多重继承的情况下,有多个vptr,并且您需要offset。看看这里:http://hacksoflife.blogspot.com/2007/02/c-objects-part-3-multiple-inheritance.html

票数 5
EN

Stack Overflow用户

发布于 2012-09-19 21:19:33

我不知道微软是怎么做的,但vtable指针并不总是位于偏移量为零的位置。可能不是这样的一个例子是多重继承(特别是当涉及虚拟基类时)。

编辑:

我将通过示例对其进行扩展。

如果第一个基类或类没有vtbl,则派生类将在偏移量0处没有vtbl指针(这种继承是不好的做法,但语言允许)。

如果存在虚基,则派生类通常在偏移量0处具有指向虚基的指针,而不是vtbl指针。

票数 2
EN

Stack Overflow用户

发布于 2012-09-19 21:28:10

此功能在虚拟继承退出时使用(考虑菱形继承图表)。这个偏移量是类本身在对象内部的偏移量。

如果B和C派生自A,D派生自这两者。

代码语言:javascript
复制
   A
 /   \
B     C
 \   /
   D

然后B和C可以是D中的任何一个顺序,这就是偏移量起作用的地方。因此,当您将类型A的对象dynamic_cast到类型B时,根据实例是类型B还是类型D,可能会有所不同。

最后为了说明,下面是不同类的可能布局

代码语言:javascript
复制
Class B:  Class C:   class D:
 | A |      | A |     | A |
 | B |      | C |     | C |
                      | B |
                      | D |

在这种情况下,B的虚函数表的偏移量可以是0(B实例情况),或者sizeof( A)+ sizeof( C)(D实例情况)

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

https://stackoverflow.com/questions/12495510

复制
相关文章

相似问题

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