MSVC上的虚拟表布局-其中';类型信息是什么? 我有下面的C++代码说明虚拟方法: class X{ O a; H b; virtual void c() = 0; virtual void d() = 0; }; class Y : public X{ virtual void c(); virtual void d(); };
在MSVC上输出以下vtable布局:MSVC上的虚拟表布局-其中';类型信息是什么? 我有下面的C++代码说明虚拟方法: class X{ O a; H b; virtual void c() = 0; virtual void d() = 0; }; class Y : public X{ virtual void c(); virtual void d(); };,c++,polymorphism,vtable,virtual-functions,C++,Polymorphism,Vtable,Virtual Functions,在MSVC上输出以下vtable布局: 1> class X size(24): 1> +--- 1> 0 | {vfptr} 1> 8 | a 1> 16 | b 1> +--- 1> 1> X::$vftable@: 1> | &X_meta 1> | 0 1> 0 | &X::c 1> 1 | &X::d 1>
1> class X size(24):
1> +---
1> 0 | {vfptr}
1> 8 | a
1> 16 | b
1> +---
1>
1> X::$vftable@:
1> | &X_meta
1> | 0
1> 0 | &X::c
1> 1 | &X::d
1>
1> X::c this adjustor: 0
1> X::d this adjustor: 0
1>
1>
1> class Y size(24):
1> +---
1> | +--- (base class X)
1> 0 | | {vfptr}
1> 8 | | a
1> 16 | | b
1> | +---
1> +---
1>
1> Y::$vftable@:
1> | &Y_meta
1> | 0
1> 0 | &Y::c
1> 1 | &Y::d
1>
1> Y::c this adjustor: 0
1> Y::d this adjustor: 0
1>
1>
阅读C++对象模型后,我在上面的VDIT布局中感到疑惑,类型信息是哪里?p> 在书中(我认为他们使用GCC vtable布局),类型信息将位于vtable的第0个元素中。对于MSVC来说,情况并非如此,因为它是一个虚拟函数-那么类型信息存储在哪里??这就是
“\u meta”
吗
这就是“元”吗
对。除了多态元数据之外,您认为这意味着什么?对于MSC,您会发现在
RTTICompleteObjectLocator
上搜索更多信息非常有用,虽然没有详细的文档记录,但大致如下所示:
struct RTTICompleteObjectLocator
{
DWORD signature;
DWORD offset;
DWORD cdOffset;
struct TypeDescriptor*;
struct RTTIClassHierarchyDescriptor*;
};
它确实位于vtable附近,因此可以通过在生成的程序集中调整指针来轻松定位
这是我在书签中保存了几年的来源:
我认为这意味着如果它没有数组索引(如上图所示),它将无法检索,因此我的问题是。。。。那么,如果它不是数组元素0或1,如何检索它呢?这会是一个特殊的非数组访问吗?@user997112:事实上,它不是虚拟函数表中的一个条目;它在元数据结构中是一个单独的字段,但同样可以访问。我注意到有一种情况下,
\u meta
条目似乎没有列在vftable中:如果类声明没有新的虚拟函数,并且重用虚拟基类中的vtable。例如,如果您有struct NoMBase{virtual void x(){}
,并定义子类结构No_Meta:virtual NoMBase{}
,那么,No\u Meta::$vftable@
不会列出&No\u Meta\u Meta
条目,而实际条目上方的数字将是-4
或-8
,而不是0
(大概是为了解释{>{vbptr}
)。我很好奇这是否有任何意义。