只有 1 个虚拟继承的钻石问题

2024-01-22

这还能解决钻石问题吗?

class A
{};

class B : virtual A
{};

class C : A
{};

class D : B, C
{};

Edit:如果不是,那是什么?和这个一样吗?

class A
{};

class B : A
{};

class C : A
{};

class D : B, C
{};

或者是别的什么?


钻石问题和对公共基础成员的模糊调用可以通过以下等效图示来最好地描述,该图示也给出了对内存模型的深入了解

实施例1

class A
{void foo(){};};

class B :public A
{};

class C :public  A
{};

class D :public  B,public  C
{};

由于继承只是将两个对象的实现依次放置,因此基类 A 的所有方法都会在派生类 B 和 C 中重复,其等效的图形表示为

                          A              A
                          |              |
                          |              |
                           B             C
                             \         /
                                \    /
                                  D

实施例2

class A
{};

class B :public  virtual A
{};

class C :public  A
{};

class D :public  B,public  C
{};

使用 virtual 关键字,编译器为派生类 B 生成一个 vtable,在 B 的 vtable 中包含一个 vptr(虚拟指针),其中存储基类 A 的偏移量。对于 C,它仍然复制基类 A 的所有方法。所以类D,通过基类 B 通过 vptr 引用基类 A 的成员,其中类 C 将基类 A 的成员作为重复副本引用。因此,钻石问题和模糊性仍然存在。

                               A         A
                             /           |
                           /             |
                           B             C
                             \         /
                                \    /
                                  D

实施例3

class A
{};

class B :public  virtual A
{};

class C :public  virtual A
{};

class D :public  B,public  C
{};

现在,当派生类 B 和 C 都虚拟继承 A 时,编译器会为 B 和 C 创建一个 Vtable,并在每个 Vtable 中创建一个 vptr 以引用基类 A 的偏移量。这最终解决了钻石问题,因为有通过 B 或 C 只能看到一份副本

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

只有 1 个虚拟继承的钻石问题 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 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
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • NG-bootstrap 和 Angular 9 兼容性

    升级到 Angular 9 后 我收到以下与 ng bootstrap 相关的错误 src app shared Components form controls dropdown select dropdown select compon
  • 我需要解决 Excel 猜测数据类型问题

    我正在创建一个实用程序来将数据从 Excel 导入到 Oracle 数据库 我有一个固定的 Excel 文件模板 现在 当我尝试通过 Jet 提供程序和 ADO Net Ole 连接工具导入数据时 我发现以下问题 有一些列尚未导入 因为它们
  • 宏未显示在宏表中

    我正在 excel 2016 中编写 VBA 宏 我编写的带有参数的宏不会显示在宏表中 仅显示那些没有参数的宏 帮助 带参数的宏在宏框中不可见 因为将它们放在那里没有意义 如果它们需要参数来运行 则无法从宏框中运行它们 因为无法向相关宏提供
  • .net 对象平等

    假设我们有两个对象 o1 和 o2 定义为 System Object 在我的情况下 o1 和 o2 可以是以下任何类型 String Int32 Double Boolean DateTime DBNull 那么我如何检查 o1 和 o2
  • 无效的 Podfile 文件意外模板 EOS

    我已经与这个错误作斗争好几天了 试图开始一份新工作 尝试在 React Native cli 项目上运行 pod install 时遇到问题 我已经尝试了这里所有可能的解决方案 但不适用于我的 错误 Invalid Podfile file
  • 用于匹配“A-Z、a-z、0-9、_”和“.”的正则表达式

    我需要一个正则表达式 它只允许输入 A Z a z 0 9 字符和点 I tried A Za z0 9 但是 这没有用 我该如何修复它 A Za z0 9 从字符串的开头到结尾 匹配这些字符中的一个或多个 Edit 注意 and 匹配 a
  • 任意多边形中最大的内接矩形

    我使用 OpenCV Stitching 已经有一段时间了 现在我想做拼接的最后一步 裁剪图像 这就导致找到一般多边形中最大的内接轴平行矩形 我已经用谷歌搜索并找到了一些答案 如何在 OpenCV 中裁剪到最大的内部边界框 https st
  • Flex 中继器和事件监听器

    乍一看 Repeater 控件看起来非常强大 但现在我有了新的想法 手头的问题 为子级添加事件监听器 Repeater 对象绑定到 ArrayCollection 并对其进行迭代 为每个项目创建新的 Vbox 子项 现在 对于每个孩子 Re
  • 当目录存在时,htaccess 重定向无法重定向

    为了制作友好的 URL 以下是应用的 htaccess 代码 RewriteEngine On RewriteCond THE REQUEST php s NC RewriteRule F RewriteRule index php id1
  • 将包含 NaN 的 Pandas 列转换为 dtype `int`

    我将数据从 csv 文件读取到 Pandas 数据框 如下所示 对于其中一列 即id 我想将列类型指定为int 问题是id系列有缺失 空值 当我尝试投射时id在读取 csv 时将列转换为整数 我得到 df pd read csv data
  • 如何检测字符串文字传递给 C 中的函数?

    我正在尝试实现 Perl 的等效版本chomp C 中的函数 我遇到了一个极端情况 其中作为参数传递的字符串文字将导致分段错误 理所当然 Example chomp some literal string n C99 中是否有一种定义的方法
  • 将两个 RGB 图像合并为一个 6 通道图像 - openCV

    我正在使用 openCV 需要将两个三通道 RGB 图像组合成一个 6 通道图像 我不确定如何将它们结合起来 有任何想法吗 首先 您必须创建一个目标矩阵 cv Mat允许创建最多的图像CV CN MAX https docs opencv
  • 是否可以测试给定表达式是否可以*无需*连接到 SQL 数据库而转换为 SQL?

    例如 This one will be converted to SQL no problem Expression
  • 如何用回收器视图模拟视图寻呼机?

    ViewPager 相对于 RecyclerView 的优势之一是它有一个 setPageTransformer 侦听器 在这里 您可以操纵页面并将其转换为在滑动之间或滑动时制作简洁的动画 我想模仿能够在使用 RecyclerView 时转
  • Game Center 排行榜分数 - “20 分”而不是“20 分”

    我目前正在为我的应用程序测试游戏中心排行榜 验证和提交分数时一切正常 但当我查看游戏中心的排行榜时 它显示 200 分 而不是 200 分 为什么分数和分数类型之间没有空格 我该如何解决它 Thanks 因此 因为我知道更多的人遇到同样的问
  • 以编程方式移动鼠标光标

    首先 我在以下位置找到了这段代码http swigartconsulting blogs com tech blender 2005 08 how to move the html http swigartconsulting blogs
  • 开发人员应该有权访问什么?

    我工作的地方是构建处理和存储敏感数据的应用程序 我们有3个环境 开发 UAT QA 用户接受测试 和生产 我工作中的开发人员无法访问 UAT 或 Production 并且对 Dev 的访问也有限 我们在开发中所能做的就是连接到开发数据库服
  • 无法使用已与其底层 RCW 分离的 COM 对象

    我正在尝试使用 OpcRcw da dll 如果我在测试控制台项目中互操作这个 dll 一切正常 但是如果我构建 dll 项目来进行互操作体操并将我的库引用到我的控制台项目中 我会收到此错误 无法使用已与其底层 RCW 分离的 COM 对象
  • 如何将 docx 或 wordml xml 文件转换为 xsl-fo?

    我一直在寻找一种将 docx 或 wordml xml 转换为 xsl fo 的方法 我读了这篇文章 Perl 最好的 XSLT 引擎是什么 https stackoverflow com questions 156683 what is
  • 只有 1 个虚拟继承的钻石问题

    这还能解决钻石问题吗 class A class B virtual A class C A class D B C Edit 如果不是 那是什么 和这个一样吗 class A class B A class C A class D B C