一个类的对象(使用单/多重继承)有多少个vptr?

2023-11-26

对于一个其 clas(child) 具有单一继承且基类多重继承 base1 和 base2 的对象,通常需要多少个 vptr。如果一个对象具有单继承和多继承,那么识别它有多少 vptr 的策略是什么?虽然标准没有指定有关 vptr 的内容,但我只想知道实现如何实现虚拟函数实现。


你为什么在乎?简单的答案是enough,但我猜你想要更完整的东西。

这不是标准的一部分,因此任何实现都可以自由地按照自己的意愿进行,但一般的经验法则是,在使用虚拟表指针的实现中,作为第零个近似值,对于动态调度,您最多需要许多指向虚拟表的指针,因为有一些类add层次结构的新虚拟方法。 (在某些情况下,虚拟表可以扩展,基类和派生类型共享一个vptr)

    // some examples:
    struct a { void foo(); };           // no need for virtual table
    struct b : a { virtual foo1(); };   // need vtable, and vptr
    struct c : b { void bar(); };       // no extra virtual table, 1 vptr (b) suffices
    struct d : b { virtual bar(); };    // 1 vtable, d extends b's vtable

    struct e : d, b {};                 // 2 vptr, 1 for the d and 1 for b                                      
    struct f : virtual b {};            // 1 vptr, f reuse b's vptr to locate subobject b
    struct g : virtual b {};            // 1 vptr, g reuse b's vptr to locate subobject b
    struct h : f, g {};                 // 2 vptr, 1 for f, 1 for g
                                        // h can locate subobject b using f's vptr

基本上,需要自己的动态分派(不能直接重用父对象)的类型的每个子对象都需要自己的虚拟表和 vptr。

实际上,编译器将不同的 vtable 合并到一个 vtable 中。什么时候d在函数集中添加一个新的虚函数b,编译器将通过将新槽附加到 vtable 的末尾来将潜在的两个表合并为一个表,因此 vtabled将是 vtable 的扩展版本b最后有额外的元素保持二进制兼容性(即dvtable 可以解释为bvtable 来访问可用的方法b),以及d对象将有一个vptr.

在多重继承的情况下,事情会变得更加复杂,因为每个基需要与完整对象的子对象具有相同的布局,而不是单独的对象,因此会有额外的 vptr 指向完整对象中的不同区域。虚拟表。

最后,在虚拟继承的情况下,事情变得更加复杂,并且同一个完整对象可能有多个 vtable,并且 vptr 会随着构造/析构的发展而更新(vptr 总是随着构造/析构的发展而更新,但没有虚拟继承, vptr 将指向基类的 vtable,而在虚拟继承的情况下,同一类型将有多个 vtable)

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

一个类的对象(使用单/多重继承)有多少个vptr? 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 格式说明符%02x

    我有一个简单的程序 include
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 将复合语句放入 for 循环的条件中

    我有一个人为的例子来演示对特定功能的请求 我想知道是否有人有一个聪明的技巧来做到这一点 以下是一个经常遇到的问题 打印一系列数字 在它们之间打印一个空格 并在末尾打印一个回车符 但没有空格 显而易见的解决方案是使最后一个 或第一个 语句成为
  • 使用 OutVariable 创建 ArrayList

    我确信发生这种情况是有正当理由的 但我不知道它是什么 我有以下代码 Deleted Items 0 ParentNode RemoveChild Items 0 Write Output Deleted 如果我使用调用此代码 Do Some
  • 通过python从音频文件中提取音频频谱

    抱歉 如果我提交重复的内容 但我想知道 python 中是否有任何库可以使您能够从音频文件中提取声谱 我希望能够获取音频文件并编写一个算法 该算法将返回一组数据 TimeStampInFile 频率 幅度 我听说这通常称为节拍检测 但据我所
  • HTTP 错误代码 505

    我已经在 google 上搜索过 505 是 不支持 HTTP 版本 但仍然无法弄清楚我的问题 我有一个带有 Tomcat 的 Web 应用程序 服务器端带有自签名证书来启用 HTTPS 无需验证客户端 客户端将验证服务器证书 我分析了wi
  • WPF 与 WinForms 或丰富的 UI 与稳定的应用程序?您如何看待 Windows 窗体平台的未来? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 WPF 与 WinForm
  • Angular 4 Universal“窗口未定义”

    我的项目运行完美 但是当我实现通用时 我得到 窗口未定义 我的错误如下 node modules hammerjs hammer js 2643 window document Hammer ReferenceError window is
  • OSX:PHP 本地主机错误并且无法加载动态库

    我该如何修复这个 php 错误 PHP Warning PHP Startup Unable to load dynamic library usr lib php extensions no debug non zts 20100525
  • 从 Thread.UncaughtExceptionHandler 启动服务?

    我正在尝试设置一个全局异常处理服务 如中提到的这个答案 这种方法听起来很合乎逻辑 因为崩溃后 我的自定义中的代码Thread UncaughtExceptionHandler可能无法成功执行 要么是因为应用程序可能未处于稳定状态 要么是因为
  • Python matplotlib -> 3D 条形图 -> 调整刻度标签位置,透明条

    我正在尝试使用 Matplotlib 中的 bar3d 在 Python 中创建 3D 条形直方图 我已经到了可以在传递一些数据后在屏幕上显示直方图的地步 但我陷入了以下困境 正确显示轴标签 当前错过了最终 或初始 刻度标签 要么使每个轴上
  • Android GridView 多选

    我已经实现了 GridView 并激活了 mGridView setChoiceMode GridView CHOICE MODE MULTIPLE MODAL 模式 现在 当我长按一个项目时 我可以从网格中选择多个项目 我想通过正常的短暂
  • 使用数据存储防止内存泄漏的最佳实践是什么?

    我尝试使用数据存储首选项 alpha07 来存储和获取数据 一切正常 我在数据存储中遇到了一些内存泄漏问题 使用数据存储防止内存泄漏的最佳实践是什么 这是我的示例代码 Preferences DataStore implementation
  • 如何从 Wildfly (Jboss) 访问 ws 端点的 CXF jar

    我尝试在 Wildfly 8 2 中部署我的 war 文件 我的应用程序使用 org apache cxf 进行 Web 服务 但 Wildfly Jboss 默认带有自己的 cxf jar 可以提供完整的 Java EE 支持 我可以消除
  • 使用 Flask-SQLAlchemy 反射表会引发 RuntimeError:应用程序未注册

    我有一个 SQLite 数据库来管理用户登录 还有一个现有的 MySQL 数据库 我将 MySQL 数据库添加到 Flask SQLAlchemySQLALCHEMY BINDS配置 当我尝试反映表格时 出现以下错误 RuntimeErro
  • R 中的多面板标题

    我有一个关于 R 的超简短问题 我的目标是为使用 par 生成的多面板图分配一个通用标题 例如 par mfrow c 1 2 plot rnorm 1000 plot rnorm 1000 因此 类似于绘图函数的 main 但扩展到两个绘
  • 使用多列的 Pandas DataFrame 聚合函数

    有没有办法编写一个聚合函数 如DataFrame agg方法 该方法可以访问正在聚合的多列数据 典型的用例是加权平均值 加权标准差函数 我希望能够写出类似的东西 def wAvg c w return c w sum w sum df Da
  • 如何避免此结构定义中出现 PhantomData?

    我有一个看起来像这样的特征 trait Handler
  • 使用 Google C++ Mocking Framework (Google Mock) (V1.5) 将任意参数传递给调用的方法

    我有一个模拟方法 当它被调用时 我希望它在调用其正常行为之前调用另一个函数 就像是 EXPECT CALL my obj MockedMethod WillOnce DoAll Invoke my obj SomeAdditionalMet
  • 你能在Python中创建多个“if”条件吗? [复制]

    这个问题在这里已经有答案了 在 JavaScript 中 可以这样做 if integer gt 3 integer lt 34 document write Something 这在Python中可能吗 Python确实允许你做这样的事情
  • 如何删除伪元素上的下划线?

    在 Chrome 和 Firefox 上 如果我在标签上应用 text decoration underline 默认情况下下划线不适用于伪元素 但在 IE 上确实如此 而且我无法删除它 我希望链接带有下划线 但不是伪元素 如果我在里面添加
  • 一个类的对象(使用单/多重继承)有多少个vptr?

    对于一个其 clas child 具有单一继承且基类多重继承 base1 和 base2 的对象 通常需要多少个 vptr 如果一个对象具有单继承和多继承 那么识别它有多少 vptr 的策略是什么 虽然标准没有指定有关 vptr 的内容 但