Visual c++ 抽象类没有虚拟函数表? 我学习了虚拟函数表及其表示,通过分析一个简单的Visual C++程序的二进制(有一些优化)。

Visual c++ 抽象类没有虚拟函数表? 我学习了虚拟函数表及其表示,通过分析一个简单的Visual C++程序的二进制(有一些优化)。,visual-c++,virtual-functions,vmt,Visual C++,Virtual Functions,Vmt,几天前,我被困在虚拟方法表内容上,打开了相同的COMDAT时问 现在我陷入了另一个问题:每当我分析一个类时,我都需要找到它的虚拟方法表。我可以通过查找它的RTTITypeDescriptor或\u s\u RTTIClassHierarchyDescriptor,在上面找到一个交叉引用,这将引导我找到\u rtticleteObjectLocator。当我找到完整对象定位器的交叉引用时,它就写在VMT之前(基本上是VMT的第一个条目) 这种方法适用于某些类(在我的程序中,它们的名称以C开头)。还

几天前,我被困在虚拟方法表内容上,打开了相同的COMDAT时问

现在我陷入了另一个问题:每当我分析一个类时,我都需要找到它的虚拟方法表。我可以通过查找它的
RTTITypeDescriptor
\u s\u RTTIClassHierarchyDescriptor
,在上面找到一个交叉引用,这将引导我找到
\u rtticleteObjectLocator
。当我找到完整对象定位器的交叉引用时,它就写在VMT之前(基本上是VMT的第一个条目)

这种方法适用于某些类(在我的程序中,它们的名称以
C
开头)。还有一些类,它们在开始时以
I
命名,我可以将它们与以
C
开头的其他类配对——例如,有一个类
CClass
,它继承自
IClass
。这些
I
-类可能用作
C
-类的接口,因此它们可能只包含抽象方法

通过搜索任何
I
-类的类型描述符或类层次结构描述符的交叉引用,我找不到任何东西——没有完整的对象定位器可以将我引导到该类的VMT(如果我对
I
-类中的所有抽象方法都正确,并且如果我正确理解抽象类的VMT是什么样子,那么应该会充满对
pure_virtual
调用的引用)

为什么
I
-类没有VMT?编译器是否优化了它,因为它将充满对
纯虚拟的
调用的引用,并以不同的方式对其进行管理?

这些“接口”抽象类在其构造函数和析构函数中可能不需要任何用户编写的代码(它们要么有一个空的主体,没有ctor init列表,要么根本就不是用户定义的);让我们调用这些纯接口类

纯接口类:概念相关但不等同于java接口(在任何成员函数中定义为零实现代码),但要小心类比,因为java接口继承语义与C++抽象类继承语义不相同。


这意味着在实践中,没有使用过的对象具有纯接口类类型:没有表达式引用具有纯接口类型的对象。因此,不需要vtable,因此在编译期间生成的vtable不包含在链接代码中(链接器可以看到未使用纯接口类vtable的符号).

抽象类永远不可能有一个完整的对象,因此我认为不需要定位一个;因此缺少完整的对象定位器。这并不意味着抽象类也缺少虚拟表。首先,一个类只要至少有一个纯虚拟成员函数,它就是抽象的;它还可以当然也有正常的、非纯虚拟的。@IgorTandetnik vtable的需要与非纯虚拟函数无关。它来自非纯虚拟c/d-tor。@curiousguy Nonsene.vtable-虚拟表的缩写-与虚拟成员函数有关,与构造函数或析构函数无关(析构函数可能是虚拟的除外)。考虑:。有两个类,除了一个有虚拟成员函数,另一个没有之外,在所有方面都是相同的;它们都有非平凡的构造函数和析构函数。有虚拟函数的一个更大;我假设额外的空间被vtable指针占用。@IgorTandetnik错了。您认为代码如何找到vtable对于给定对象?提示:vtable指针又名vptr。在大量使用接口的代码中,故意省略v-table是常见的。