根据 MSDN,__RTDynamicCast() 函数用于dynamic_cast
在 Visual C++ 中实现。它的参数之一是LONG VfDelta
被描述为“对象中虚函数指针的偏移量”。
AFAIKvptr
始终位于对象的开头,因此偏移量将始终为零。我仔细研究了各种代码片段的反汇编使用dynamic_cast
,我从来没有见过除了零被传递来代替这个参数的任何东西。
除了对象开始之外,是否vptr
曾经位于任何地方?这个偏移量可以不为零吗?
根据 MSDN,__RTDynamicCast() 函数用于dynamic_cast
在 Visual C++ 中实现。它的参数之一是LONG VfDelta
被描述为“对象中虚函数指针的偏移量”。
AFAIKvptr
始终位于对象的开头,因此偏移量将始终为零。我仔细研究了各种代码片段的反汇编使用dynamic_cast
,我从来没有见过除了零被传递来代替这个参数的任何东西。
除了对象开始之外,是否vptr
曾经位于任何地方?这个偏移量可以不为零吗?
在多重继承的情况下,有多个继承vptr
,您需要offset
. 看看这里:http ://hacksoflife.blogspot.com/2007/02/c-objects-part-3-multiple-inheritance.html
我不知道微软做了什么,但 vtable 指针位于偏移量零处并不总是正确的。可能不是多重继承的一个例子(尤其是在涉及虚拟基类的情况下)。
编辑:
我将通过示例对此进行一些扩展。
如果第一个基类或类没有 vtbl,则派生类在偏移量 0 处将没有 vtbl 指针(这种继承是不好的做法,但语言允许)。
如果有虚基,派生类通常会有一个指向偏移 0 处的虚基的指针,而不是 vtbl 指针。
当虚拟继承退出时使用此功能(想想菱形继承图)。这个偏移量是类本身在对象内部的偏移量。
如果 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实例情况)