3

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

AFAIKvptr始终位于对象的开头,因此偏移量将始终为零。我仔细研究了各种代码片段的反汇编使用dynamic_cast,我从来没有见过除了零被传递来代替这个参数的任何东西。

除了对象开始之外,是否vptr曾经位于任何地方?这个偏移量可以不为零吗?

4

3 回答 3

5

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

于 2012-09-19T13:17:56.097 回答
2

我不知道微软做了什么,但 vtable 指针位于偏移量零处并不总是正确的。可能不是多重继承的一个例子(尤其是在涉及虚拟基类的情况下)。

编辑:

我将通过示例对此进行一些扩展。

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

如果有虚基,派生类通常会有一个指向偏移 0 处的虚基的指针,而不是 vtbl 指针。

于 2012-09-19T13:19:33.380 回答
1

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

如果 B 和 C 源自 A,而 D 源自两者。

   A
 /   \
B     C
 \   /
   D

然后 B 和 C 可以在 D 中按任意顺序排列。这就是偏移量起作用的地方。因此,当您将 A 类型的对象动态转换为 B 类型时,它可能会有所不同,具体取决于实例是 B 类型还是 D 类型。

最后说明一下,这里是不同类的可能布局

Class B:  Class C:   class D:
 | A |      | A |     | A |
 | B |      | C |     | C |
                      | B |
                      | D |

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

于 2012-09-19T13:28:09.733 回答