没有虚拟继承的多重继承

2023-12-29

我试图理解多重继承,这是我的代码:

struct A {
  A() {}
  static int n;
  static int increment() { return ++n; }
};
int A::n = 0;

struct B : public A {};
struct C : public A {};
struct D : public B, C {};

int main() {
  D d;
  cout<<d.increment()<<endl;
  cout<<d.increment()<<endl;
}

这段代码有效。但是,如果我改变increment()到非静态它将失败。

我的问题:

  1. 为什么编译器抱怨非静态版本的不明确调用increment(),同时满足静态的?
  2. 如果我添加另一个increment()函数到B或C,编译器也会抱怨,即使声明为静态。为什么?

暧昧是什么意思?

当编译器无法根据上下文决定调用哪个函数时,就会抱怨调用不明确。因此,为了理解投诉,您必须检查可能存在的歧义。

为什么编译器抱怨非静态版本的increment()的调用不明确,而满足静态版本?

根据定义,一个static类的函数不依赖于该类的任何实例。您可以将其称为A::increment()(参见,没有实例)。

菱形继承的问题不在于编译器不知道是哪一个code执行,就是不知道是哪个this提供(有两个A在你的D对象,其中包含一个B和一在C).

当您使用static的函数A,没有隐含的this通过了,所以没有问题;如果你尝试使用非static函数,那么编译器无法决定是否this应该指向A in B or in C,这是有歧义的。

如果我向B或C添加另一个increment()函数,编译器也会抱怨,即使声明为静态。为什么?

此时,编译器可能会选择B::increment() and C::increment(),应该选择哪个?这是模棱两可的。

当您有线性层次结构时,它会调用与其“最接近”的层次结构(这会隐藏继承树中更下方的层次结构),但在这里B and C是两个独立的分支,并且没有“更好”的分支。

注意:即使B不实施increment, since A你可以打电话吗B::increment()这实际上调用了A::increment()。同样适用于C.

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

没有虚拟继承的多重继承 的相关文章

  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 了解 MVC-5 身份

    我创建了一个新的ASP NET MVC 5申请与Individual User Accounts然后更新了所有的Nuget packages在解决方案中 现在我尝试遵循一些教程中显示的一些指南 但遇到了一些问题 第一个是一个名为Applic
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R

随机推荐

  • 在 Jenkins 管道脚本中隐藏密码

    我正在尝试在我的 Jenkins 构建中隐藏密码 我已经试了 但是 这似乎不适用于我的 Jenkins 管道脚本 因为如果我定义密码PASSWD1然后我在脚本中使用它 如下所示 PASSWD1 我正进入 状态 No such DSL met
  • 如何用安全的 Rust 表达相互递归的数据结构?

    我正在尝试在 Rust 中实现类似场景图的数据结构 我想要一个与此 C 代码等效的代码safe Rust struct Node Node parent should be mutable and nullable no parent st
  • Eclipse、dropins、控制台模式、Axis2 和 dropins 未安装

    我是 eclipse 开发平台的新手 在尝试安装以下插件时 我有一个奇怪的行为 org apache axis2 eclipse codegen plugin 1 6 2 jar org apache axis2 eclipse servi
  • 设置现有语言环境后,文本转语音会返回不同的不存在语言环境

    原问题 我有一个标准的 texttospeech android speech tts TextToSpeech 我初始化它并使用设置语言tts setLanguage Locale getDefault 默认区域设置是 de DE 对于德
  • 根据索引计算numpy数组中所有点到单个点的距离

    假设二维数组如下 arr array 1 1 1 4 5 8 2 6 9 if point array 1 1 给出然后我想计算所有指数的欧几里德距离arr到点 1 1 结果应该是 array 1 41 1 1 41 1 0 1 1 41
  • 根据类型创建不同的对象

    我有一个数据库表 其中包含名为 type 的列 对于数据库列中的每一行 我必须根据类型创建一个对象 目前我使用 if else 语句 if type equals object1 Object1 object1 new Object1 el
  • 如何在knitr文件中自动为R包创建BibTex引用?

    我不确定这是否是 R LaTeX 或 BibTex 问题 我试图自动生成一个包含 R 包引用的 bib 文件 然后在末尾列出它们 我能够生成 BibTex 文件 并且没有发现 BibTex 文件有任何问题 但是当我编译 PDF 时 条目没有
  • 局部变量 n 可能尚未初始化

    import View UI public class App UI m public static void main String args System out println Hello UI n n menu UI 类位于 Vie
  • TinyMCE 多个编辑器在 Yii2 中无法正确渲染

    我正在使用 Yii2 和来自2amigos yii2 tinymce widget https github com 2amigos yii2 tinymce widget 仅当我仅使用一次时 编辑器看起来才正确 但是当我使用多个编辑器时
  • 在 Swift 中使用 hidesBackButton 隐藏导航栏中的后退按钮

    我想在从一个视图转换到另一个视图时隐藏后退按钮 我阅读了有关此问题的问题 每个答案都是 使用hidesBackButton 这样做的问题是 当我将其放入 viewDidLoad viewWillAppear 中时 后退按钮箭头会隐藏 但字符
  • 找不到“MySql.Data.MySqlClient”ADO.NET 提供程序的实体框架提供程序

    我尝试将实体框架与 MySQL 一起使用 但出现上述错误 我安装了最新的 MySQL 连接器 完整的错误如下 No Entity Framework provider found for MySql Data MySqlClient ADO
  • Material UI 自动完成 + 无限滚动在一起?

    问题 获取双滚动条 删除纸张滚动条会使自动完成内容不可滚动 因此仅显示下拉列表可见高度中的内容 如果我隐藏另一个滚动 则不会调用无限滚动 API 我怎样才能让它工作 描述 我正在尝试使用 Material UI Autocomplete 创
  • 组合框中的默认文本

    我有 2 个组合框 如图所示 想知道是否可以为组合框设置某种文本字段 因此第一个框将说明成员 这样我想摆脱组合框上方的文本框 我知道这可以通过将 成员 添加到数据集中来完成 但我不想这样做 还有别的办法吗 BR 您正在寻找的效果称为 水印
  • 当手机空闲/打瞌睡/锁定时 Android 服务不工作

    晚上好 我已经尝试了好几天了 我真的不知道还能尝试什么 我基本上尝试了我在网上找到的所有东西 但它仍然不起作用 但我有一种感觉 一旦我找到了解决方案它一定是非常简单的事情 我正在开发一个更大的项目 但在这里我只是想得到一个非常简单的示例 我
  • Jetty 中的 ServletHandler 和 ServletContextHandler 有什么区别?

    我正在尝试开始使用嵌入式 Jetty 服务器 我只想根据请求路径将请求映射到不同的 servlet 创建一个有什么区别ServletHandler并向其中添加 servlet 而不是创建ServletContextHandler并向其中添加
  • 复制迁移的目的是什么?

    背景 如果可执行文件具有在共享对象中定义的外部数据引用 则编译器将使用复制重定位并将副本放置在其 bss 部分中 本网站详细介绍了复制迁移 http www shrubbery net solaris9ab SUNWdev LLM p22
  • 验证失败:上传文件的扩展名与其内容不匹配

    我正在使用回形针 gem 上传文件 我的回形针 gem 版本是回形针 4 1 1 上传文件时抛出 Validation failed Upload file has an extension that does not match its
  • 我是否需要为图片元素内的每个源重复类属性? (HTML5)

    我正在将图像转换为 webp 这意味着我需要使用 图片 标签而不是 img 因为图片允许为不支持 webp 的设备和浏览器回退到 png 格式 无论如何 我有一个如下所示的 img img class usp pics pic1 src i
  • 检查 Arduino 中的内存占用

    我正在使用 Arduino 开发一个简单的项目 最近 我必须将我的一个变量转换为 long 而不是 int 为了让事情简单 我只是移动了它与之交互的所有数字 所以我不必担心跨类型比较和数学 这看起来很浪费 但这只是我自己的一个时钟 我并不在
  • 没有虚拟继承的多重继承

    我试图理解多重继承 这是我的代码 struct A A static int n static int increment return n int A n 0 struct B public A struct C public A str