没有用于抽象 class 的虚函数 Table?

No Virtual Function Table for abstract class?

我正在通过分析一个用 Visual C++ 编写的简单程序的二进制文件(进行了一些优化)来了解虚函数 table 及其表示。

几天前,我问 时卡在虚拟方法 table 内容上 相同的 COMDAT 折叠

现在我被困在别的事情上:每当我分析一个 class,我需要找到它的虚拟方法 Table。我可以通过找到它的 RTTITypeDescriptor_s_RTTIClassHierarchyDescriptor 来做到这一点,找到它的交叉引用,这应该会引导我到 _RTTICompleteObjectLocator。当我找到对完整对象定位器的交叉引用时,它就写在 VMT 之前(基本上是 VMT 的第 -1 个条目)。

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

通过搜索任何 I-classes 的类型描述符或 Class 层次描述符的交叉引用,我找不到任何东西——没有完整的对象定位器会引导我到 class 的 VMT(如果我对 I-class 中的全抽象方法是正确的,那应该充满对 pure_virtual 调用的引用es,如果我理解正确的话,摘要 class 的 VMT 是什么样的)。

为什么 I-classes 没有 VMT?编译器是否优化了它,因为它会充满对 pure_virtual 调用的引用并以不同的方式管理它?

这些 "interfaces" 抽象 classes 可能不需要用户在它们的任何构造函数和析构函数中编写代码(它们要么有一个空体并且没有 ctor-init-list,或者根本就没有用户自定义);我们称这些 纯接口 classes.

[纯接口 class:概念与 Java 接口相关但不相同,这些接口在任何成员函数中被(曾经?)定义为具有零实现代码。但要小心类比,因为 Java 接口继承语义与 C++ 抽象 classes 继承语义不同。]

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