虚拟函数的Vtable如何工作

2023-11-22

我对虚拟表有一个小疑问,每当编译器遇到类中的虚拟函数时,它都会创建Vtable并将虚拟函数地址放在那里。对于其他继承的类,也会发生类似的情况。它是否在每个类中创建一个指向每个 Vtable 的新指针?如果不是,当创建派生类的新实例并将其分配给 Base PTR 时,它如何访问虚拟函数?


每次你创建一个包含虚函数的类,或者你 从包含虚函数的类派生,编译器 为该类创建一个唯一的 VTABLE。

如果你 不要重写在基类中声明为虚拟的函数, 编译器使用基类版本的地址 派生类。

然后将 VPTR 放入 班上。使用简单时,每个对象只有一个 VPTR 继承。 VPTR 必须初始化为指向 相应 VTABLE 的起始地址。 (这发生在 构造函数。) 一旦 VPTR 被初始化为正确的 VTABLE,对象 效果“知道”它是什么类型。但这种自知之明毫无价值 除非在调用虚函数时使用它。 当您通过基类地址调用虚函数时( 当编译器没有所有信息时的情况 执行早期绑定所必需的),一些特殊的事情发生了。 而不是执行典型的函数调用,这只是一个 汇编语言 CALL 到特定地址,编译器 生成不同的代码来执行函数调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟函数的Vtable如何工作 的相关文章

  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • Monotouch全局异常处理

    我在野外发现了一只令人讨厌的虫子 但我无法确定它的具体情况 有没有办法拥有全局 Try Catch 块 或者有办法处理 Monotouch 中未处理的任何异常 我可以包起来吗UIApplication Main args 在 try cat
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 如何让XmlReader读取C#中的属性?

    我有一个 XML Stream 其中包含以下 XML 内容
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 连接到没有元数据的网络服务

    我想连接到此网络服务 https training api temando com schema 2009 06 server wsdl https training api temando com schema 2009 06 serve
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb

随机推荐

  • 如何在 WPF 中创建基页?

    我决定我的所有 WPF 页面都需要注册路由事件 而不是包括 public static readonly RoutedEvent MyEvent EventManager RegisterRoutedEvent MyEvent Routin
  • 通过 .txt 文件向 Scrapy Spider 传递要抓取的 URL 列表

    我对 Python 有点陌生 对 Scrapy 也很陌生 我已经设置了一个蜘蛛来爬行并提取我需要的所有信息 但是 我需要将 URL 的 txt 文件传递 给 start urls 变量 例如 class LinkChecker BaseSp
  • 在 Xcode 中的 64 位 Mac 上编译 opencv 2.4

    我有一个 opencv 项目 我一直在 ubuntu 12 04 下开发 在具有 x86 64 架构的 mac 上的 parallels VM 上 我认为存在许多屏幕切换性能问题是由 VM 造成的 其中 Linux 视频模式会翻转几秒钟 而
  • 插入时锁定表

    我有一个从视图填充的大表 这样做是因为视图需要很长时间才能运行 并且更容易在表中提供可用的数据 每隔一段时间就会运行一个过程来更新表 TRUNCATE TABLE LargeTable INSERT INTO LargeTable SELE
  • MySQL - 自动增量到guid

    我有一个带有自动递增 ID 字段的表 如下所示 company id name 1 International Client 2 Oracle 3 test 4
  • 将字符串转换为 Joda LocalTime 格式 (HH:mm:ss) 并删除毫秒

    DateTimeFormatter fmt DateTimeFormat forPattern HH mm ss LocalTime localTime fmt parseLocalTime 02 51 20 System out prin
  • 如何获得对右值的引用?

    我用过std move and std forward在C 中 我的问题是 标准库实际上是如何实现这些功能的 如果您可以获取左值的地址 并且右值完全不是左值 那么您如何实际实现这些引用 这些新设施是否允许 auto x 3 或类似的东西 你
  • 如何仅水平设置表格中的单元格间距

    我想设计下面写的表格的样式 table border 1 cellspacing 10 tr th Month th th Savings th tr tr td January td td 100 td tr table 问题是单元格间距
  • firebase-core 和 firebase-analytics 库有什么区别?

    谷歌最近发布了新版本的Firebase 所以我尝试迁移到 Firebase 分析 那么这些库有什么区别 com google firebase firebase analytics 9 0 0 and com google firebase
  • .Net Machinekey.Protect - 使用什么算法?

    我正在使用 Machinekey Protect 和 Machinekey Unprotect 来加密应用程序中的值 一个潜在客户正在执行安全审核 并询问了此方法使用的加密算法 我正在努力使用谷歌找到答案 任何有关可验证链接的帮助将不胜感激
  • 谷歌地图信息窗口位于右侧

    如何在左侧显示带有箭头的信息窗口 而不是在底部 屏幕截图示例在这里 已经有一段时间了 也许您确实对这个话题产生了兴趣 但我想说 无需使用任何第三方工具就可以 只需添加pixelOffset to the infowindow像这样 var
  • 同时按下多个按钮

    在我的 WP 7 1 应用程序中 我有一个包含多个按钮的页面 我注意到 当按下任一按钮时 无法按下其他按钮 我怎样才能克服这个问题 我需要能够允许用户同时按下多个按钮 不幸的是 您无法同时处理多个按钮点击 不过 有一种方法可以解决这个问题
  • 如何向 HTML5 Canvas 添加撤消功能?

    我有一个用 HTML5 和 Javascript 完成的草图应用程序 我想知道如何创建一个撤消按钮 这样您就可以撤消您最后绘制的内容 任何想法 您必须将所有修改存储在数据结构中 然后如果用户想要的话可 以删除最新的修改undo它 然后 您再
  • 带有基于文件的电子邮件后端服务器的 Django 测试框架

    我在Django框架中制定了测试用例 使用案例 我正在使用 API 通过向用户发送电子邮件来注册用户 当他们单击电子邮件中提供的链接时 他们的帐户就会被激活 在我的 settings py 中我使用 EMAIL FILE PATH djan
  • 将图标与 JCheckBox 一起使用

    我有一个 swing 应用程序 我想在其中使用带有图标的 JCheckbox 我构建的图标如下 JCheckBox unsubmit new JCheckBox Unsubmit applet undo 当我这样做时 标签和图标出现在我的
  • Rails 使所有路由默认格式为::json

    您可以将所有路由默认为json 我有以下 api 范围 但我想知道您是否可以对全局范围执行相同的操作 scope api defaults format json do get search query location gt search
  • Hive - LIKE 运算符

    我不知道如何处理这个问题 这是我的数据 Table1 Table2 BRAND PRODUCT SOLD Sony Sony ABCD 1233 Apple Sony adv 1233 Google Sony aaaa 1233 IBM A
  • 角度 2 贝宝

    我正在使用 Angular 2 和 Firebase 建立一个新的电子商务项目 我的问题是如何集成贝宝按钮 当客户点击它时 他们将被重定向到贝宝并付款 然后重定向回我的网站 目前 我设法让他们回来 要么按照这个 github 存储库中的指示
  • gnuplot 多条线,X 轴上有时间

    我已经查看了问题 但仍然无法正常工作 我的数据集是这样的 date cpu mem 23 00 39 21 9 2 1 23 00 44 21 8 2 1 23 00 49 21 8 2 1 23 00 54 21 8 2 1 23 00
  • 虚拟函数的Vtable如何工作

    我对虚拟表有一个小疑问 每当编译器遇到类中的虚拟函数时 它都会创建Vtable并将虚拟函数地址放在那里 对于其他继承的类 也会发生类似的情况 它是否在每个类中创建一个指向每个 Vtable 的新指针 如果不是 当创建派生类的新实例并将其分配