Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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上的虚拟表布局-其中';类型信息是什么? 我有下面的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>

在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>  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}
)。我很好奇这是否有任何意义。