问题标签 [vtable]

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 投票
2 回答
16076 浏览

c++ - 对 vtable 的未定义引用 - 虚拟成员,由 gsoap 生成的类

gsoap 及其工具 wsdl2h 和 soapcpp2 为我提供了一个包含以下内容的 soapStub.h 文件:

我从一个使用该类的小应用程序开始,使用来自 informix DB 的数据填充对象。

但是要成功编译,我必须放弃所有虚拟的东西——我发现很多关于这个错误和在子类中使用虚拟成员的帖子——否则我会得到

我承认,经过多年的脚本编写,我很难理解 C++ 代码......我想征求任何建议,下一步该尝试什么。我的类不是派生类,例如是什么让我想知道。

0 投票
1 回答
1331 浏览

c++ - 谁在虚拟继承中调用构造函数?

不是在虚拟继承的情况下,调用构造函数是大多数派生类的责任吗?注意:这里的 base 是虚拟和私人继承的。

0 投票
2 回答
248 浏览

c++ - 派生类对基类对象的调用方法

我写了几行我认为不应该编译的代码。我在指向基类对象的静态转换指针上调用派生类的方法,如下所示:

打印的值显然是垃圾,但这是否应该编译?如何gcc做到这一点?

0 投票
3 回答
1897 浏览

c++ - 完全纯虚拟类的 Vtable 放置

根据我对 C++ 规范的(有限)知识,具有虚拟成员的类的 vtable 放置在第一个非纯非内联虚拟方法的定义中。编译器如何处理从具有所有纯虚拟方法(例如接口)的类继承的类?在这种情况下,vtable 放在哪里?

0 投票
4 回答
15031 浏览

c++ - 如何用虚函数确定类的大小?

这是一种家庭作业问题。对于以下代码,

输出为:8

谁能解释一下它是8个字节吗?如果 vtable 实现依赖于编译器,我应该在面试中回答这种问题?那么虚拟基类呢?

编辑:我正在一个 32 位平台上工作。

0 投票
5 回答
64180 浏览

c++ - Q_OBJECT 抛出“未定义的 vtable 引用”错误

我在 Windows 7 Ultimate 32 位上使用 Qt Creator 2.0.1 和 Qt 4.7.0(32 位)。

考虑以下代码,这是产生错误的最低要求:

上面的代码片段导致以下链接器错误:

在函数“T”中:

未定义对 `vtable for T' 的引用

未定义对 `vtable for T' 的引用

在函数“~T”中:

未定义对 `vtable for T' 的引用

未定义对 `vtable for T' 的引用

如果我注释掉包含的行Q_OBJECT,它编译得很好。我需要信号和插槽,QGraphicsItem所以我需要Q_OBJECT.

代码有什么问题?谢谢。

0 投票
3 回答
2157 浏览

c++ - VS2010 中使用虚函数的 __purecall 问题 - 一旦方法获得纯调用

我有一个非常奇怪的问题:

我使用我的一个基类:IEventlistener(),它被许多其他类实现。大多数情况下,系统都在工作。但是现在出现了一个非常奇怪的问题。

一旦类(CGUIService)实现了接口,一种方法(VGetListenerName)按预期工作,另一种方法(VHandleMessage)在我检查调用堆栈时得到一个纯调用,我不明白为什么-.-(似乎vtable不知何故被覆盖或超出范围...)

我做了一个截图,这样你就可以在我调用 VHandleMessage 之前看到变量,这当然会导致调试断言 R6025 - 纯虚函数调用,因为不知何故,实现的方法没有输入到 IEventlistener() 的 vtable 中。

高分辨率:www.fantasyhaze.com/cb/Error_purecall.png www.fantasyhaze.com/cb/Error_purecall.png

我希望有人能给我一个提示:)

编辑1。)

所以只是为了解释一下,我创建了一个新的屏幕截图,显示了相同的过程,但现在我已经包含了另外 2 个不纯的虚函数并且有一个实现(由于时间原因,我没有时间在使用该接口的每个类中再次实现所有方法)

紫色的是新的,红色的是不起作用的,橙色的是以前的方法,现在有效,现在仍然有效

您可以在左侧看到 VGetListenerName,VHandleEvent1,VHandleEvent2 工作(调试点 + 当前位置)并且这 3 个在 vtable 中......但不是重要的一个(红色)

高分辨率:www.fantasyhaze.com/cb/Error_purecall2.png vtable问题2

编辑2。)

解决方案:

主要问题是,CGUIService 继承自 IBase。为了访问该服务,我使用了一个存储每个服务的服务定位器。因此,它在 Instance Getters Service::GetServiceInstance() 中执行 static_cast,并且还执行了 static_cast 以将服务存储为 IBase。但是 IEventListener 没有在 IBase 中实现,而且服务在没有 IEventListener 的情况下被强制转换回 IBase 并且 vtable 不正常。现在 IBase 实现了 IEventListener 并且它可以工作,因为 static_cast 正确地转换了 IEventListener :)

谢谢你的提示:)

0 投票
5 回答
5058 浏览

c++ - 如何正确解决“未定义对 vtable 的引用”错误?

我已经阅读了有关此问题的常见问题解答和其他几个网站,但我似乎找不到合适的解决方案。我很确定你以前听过这个问题,如果可能的话,我想就如何解决这个问题寻求具体帮助。

具体的错误是: 错误:未定义对 `vtable for FGui' 的引用 它总是指向 fgui.cpp 中的构造函数,但我看不出它有什么问题。

FGui 是继承自一个名为“FFoo”的类,该类继承自 QMainWindow。相关代码:

(在 ffoo.h 中:)

(在 ffoo.cpp 中:)

FGui 文件仍然很简单,因为我最近才开始制作课程。

(fgui.h:)

(fgui.cpp:)

如果有人能告诉我如何解决这个问题,我将不胜感激。提前致谢。:)

0 投票
4 回答
6881 浏览

c++ - 如何对导出 C++ 类的 DLL 使用延迟加载

我有一个 DLL one.dll,它使用从viaTwoClass导出的类。我想使用for ,但出现链接错误:two.dllclass __declspec(dllexport)one.dll/delayloadtwo.dll

那是在发布版本中;在调试版本中它可以工作。(我不知道 Release 和 Debug 在 vtable 导出方面有什么区别,也找不到任何编译器开关或编译指示来控制它。)

如何/delayload在发布版本中使用导出此类类的 DLL?

0 投票
3 回答
1359 浏览

c++ - 与位置无关的代码和 vtable

位置无关代码中的虚函数是如何实现的?

我知道如果我的类有虚函数,编译器通常会为它生成一个包含所有虚函数地址的虚表,并在我的类的每个对象中存储一个指向虚表的指针。

现在,如果我的代码与位置无关,编译器就无法知道虚函数(或任何函数)的地址。那么它有什么作用呢?

我想知道真正的编译器做了什么(不是理论上可能的);我最感兴趣的是 linux 32 位平台,但其他平台也有点有趣。