问题标签 [vmt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
62 浏览

inheritance - 来自不相关类的虚拟功能表条目

我正在浏览一个简单的 C++ Windows 程序(我没有源代码,只有二进制文件)的 VFT(VMT),它由 Visual Studio 编译并进行了某种优化。

我注意到这是使用继承和多态性。我找到了s_RTTIBaseClassArray程序具有的每个类的 struct 位置。在那个位置有一个指向 struct 的指针数组_s_RTTIBaseClassDescriptor。基类描述符数组应为您提供有关当前类派生自的所有类的信息。

虚函数(方法)表是一个表,其中包含指向当前类的所有虚函数的指针。然而,在几个类的 VFT 中,我发现了一个指向一个虚拟方法的指针,该方法实际上属于一个不同的类,该类(根据基类数组)与当前类无关。下面的例子:

这个例子很短,实际的类有更多的虚拟方法。

检查后ClassC_VM3我注意到,它只包含两个指令:

到目前为止,我发现了大约 3 个与此示例类似的 VMT,无关的方法总是这么短。

我的问题是:是什么原因造成的?的代码是否ClassC_VM3可以与某些ClassA方法的代码相同,所以编译器只是对其进行了优化?

0 投票
1 回答
770 浏览

visual-c++ - 抽象类没有虚函数表?

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

几天前,当我被困在具有相同 COMDAT 折叠的虚拟方法表内容上时,我问了这个问题

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

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

通过搜索对任何 -classes 的 Type Descriptor 或 Class Hierarchy Descriptor 的交叉引用,I我找不到任何东西——没有完整的对象定位器可以引导我到类的 VMT(应该充满pure_virtual调用 if我对I-classes 中的所有抽象方法是正确的,如果我正确理解抽象类的 VMT 是什么样的)。

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

0 投票
1 回答
81 浏览

function - 如何在帕斯卡中看到 VMT?

我能以某种方式在 FREE Pascal 中看到 VMT 表吗?如果 VMT 表在通过遗传连接的两个对象中具有相同数量的项目,我很感兴趣?

例如在这个模型中,VMT 表中会有什么?

所有功能或更多功能是否会有一张表( [Ob1 AND Ob2] 之间的表格和 [Ob2 AND Ob3] 之间的表格)?

表格中会有什么?

0 投票
0 回答
88 浏览

delphi - Delphi:如果只是 VMT 不同,如何动态更改类的类型?

假设您有 aTAncestorClass及其后代TDescendantClass1TDescendantClass2。还假设后代只是在一些不同的覆盖虚拟方法中彼此不同。否则所有字段都是相同的。也就是说,物理上的实际对象是相同的,只是它们的 VMT 不同。

到目前为止没有什么特别的。

问题是我想在需要这个东西的任何时候动态地改变一个已经创建的对象,TDescendantClass1反之亦然TDescendantClass2。不像第一眼看上去那么难看——因为这些物体本质上是一样的。我只想在每次类型更改后调用适当的虚拟方法。理论上替换 VMT(或只是与 VMT 不同的区域)就足够了,但是这 - 否则简单而琐碎的 hack - 非常肮脏,没有人想在他的代码中使用这些东西。但是“干净”的方式——用正确的类创建一个新对象,然后复制并释放原来的对象——显然是没有问题的。

那么,有人有更体面的想法来做到这一点吗?

0 投票
1 回答
106 浏览

c++ - C++ 如何获得指向类的虚函数表的指针?

鉴于:

例子.h

例子.cpp

假设我想从“scratch”创建一个Derived的实例。由于它包含一个虚函数,来自Base,我将如何获取其虚函数表的地址,以便我可以执行以下操作:

主文件

这个编译器是特定的吗?如果是这样,如果有人熟悉它,我正在使用 MinGW。

0 投票
1 回答
212 浏览

c++ - 如何获取 C++ 接口 VMT 的地址

语境:

我正在尝试使用 Delphi 应用程序中的一些 COM 接口(Direct2D 1.1)。为此,我必须将接口移植到 Delphi。我已经这样做了,但是其中一个接口有问题:我调用的方法不正确。我通过在 C++ 和 Delphi 中编写完全相同的代码来验证这一点。在调试器下运行两者,我看到Delphi调用的代码与C++调用的代码不一样。所以我在移植那个接口时犯了一个错误。

为了找出我的错误在哪里,我想转储所有方法指针以比较 C++ 和 Delphi 显示的地址。它们应该与指向同一个 DLL 的点相同。

我不知道如何掌握VMT!我已阅读内容,但不适用于我的情况:.h 文件不包含 C 等效项。

我正在寻找类似于我用来检查结构的 offsetof() 和 sizeof() 的东西。以及获取给定接口方法地址的东西。

任何帮助表示赞赏。PS:我希望我的英语是可以理解的。