构造函数继承和自定义构造函数

2024-01-10

使用这个层次结构:

struct TestBase {
    // Constructor
    TestBase();
    TestBase(int a);
    TestBase(TestBase const &testBase);

    // Destructor
    virtual ~TestBase();
};

struct TestChild : public TestBase {
    // Constructor inheritance
    using TestBase::TestBase;
};

使用此测试代码:

TestBase testBase;                  // 1) Custom constructor
TestChild testChild;                // 2) Default constructor created by the compiler
TestChild testChild2(1);            // 3) Inherited from parent with 'using' keyword
TestChild testChild3(testChild);    // 4) Default copy constructor created by the compiler ?
TestChild testChild4(testBase);     // 5) Doesn't work, why it doesn't inherit ?

首先,我认为在测试4中,复制构造函数是从TestBase继承的(通过“using”关键字),但实际上这是因为编译器生成了一个默认的复制构造函数,它调用父类的复制构造函数,这是正确的吗?

复制构造函数不能被继承,因为它必须具有与类相同的参数类型,这也正确吗?

但为什么测试 5 无法编译?它不是 TestChild 类的复制构造函数,因此它必须被继承,不是吗?


这是错误消息:

foo.cpp: In function ‘int main()’:
foo.cpp:21:34: error: no matching function for call to ‘TestChild::TestChild(TestBase&)’
 TestChild testChild4(testBase);     // 5) Doesn't work, why it doesn't inherit ?
                              ^
foo.cpp:21:34: note: candidates are:
foo.cpp:11:12: note: TestChild::TestChild()
     struct TestChild : public TestBase {
            ^
foo.cpp:11:12: note:   candidate expects 0 arguments, 1 provided
foo.cpp:13:25: note: TestChild::TestChild(int)
         using TestBase::TestBase;
                         ^
foo.cpp:13:25: note:   no known conversion for argument 1 from ‘TestBase’ to ‘int’
foo.cpp:11:12: note: TestChild::TestChild(const TestChild&)
     struct TestChild : public TestBase {
            ^
foo.cpp:11:12: note:   no known conversion for argument 1 from ‘TestBase’ to ‘const TestChild&’
foo.cpp:11:12: note: TestChild::TestChild(TestChild&&)
foo.cpp:11:12: note:   no known conversion for argument 1 from ‘TestBase’ to ‘TestChild&&’

A 使用声明命名构造函数隐式声明了一组继承的构造函数,但值得注意的是,有些构造函数不是继承的。


标准怎么说?

12.9 继承构造函数 [class.inhctor]

3 For each non-template constructor in the candidate set of inherited constructors other than a constructor having no parameters or a copy/move constructor having a single parameter, a constructor is implicitly declared with the same constructor characteristics unless there is a user-declared constructor with the same signature in the complete class where the using-declaration appears or the constructor would be a default, copy ,or move constructor for that class.

上面的句子可能看起来更神秘,但它实际上是这样的。用简单的英语来说,它的意思是构造函数仅在上下文中被继承using Base::Base如果构造函数;

  • 不是模板,并且;
  • 不是默认构造函数(即没有参数),并且;
  • 不是复制/移动构造函数,并且;
  • 中没有明确声明Derived与通常继承自的构造函数匹配Base

结论

考虑到上述内容,我们意识到构造函数TestBase这需要一个TestBase const&是一个复制构造函数,并且由于复制构造函数不是继承的,这就是它不存在于TestChild.

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

构造函数继承和自定义构造函数 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li

随机推荐

  • HttpWebRequest排队库,保证请求交付

    只是想知道是否存在框架类来处理请求排队 发送请求时 应将其添加到队列中 如果出现问题 没有互联网 则应存储请求 并稍后尝试再次发送 同时 可以创建更多请求 如果仍然没有网络 则所有新请求都应存储在队列中 并在网络恢复时再次发送 打算实现相同
  • 我应该担心 std::vector 的内存碎片吗?

    我应该担心 std vector 的内存碎片吗 如果是这样 有什么方法可以帮助预防吗 我并不总是预测我的程序会在 PC 上运行 它们也可能会在嵌入式设备 游戏控制台上运行 因此我并不总是能够依赖虚拟内存 然后 我再次相信使用动态大小的数组而
  • 如何在android中点击动态创建的编辑文本时获取编辑文本的ID?

    我正在根据项目要求在布局中动态创建视图 视图序列来自 json 当我单击编辑文本时 时间选择器函数会调用在编辑文本中设置时间 但是当我设置编辑文本值时 它会给出上次创建的编辑文本的 ID 这是我的代码 for i 0 i lt alist
  • 使用 system.time() 对 R 代码计时时出现“未找到对象”和“意外符号”错误

    我正在读这本书 R 编程实践 以下代码是直接从书中粘贴的 但不会在 RStudio 中运行 我试图理解为什么 system time output lt rep NA 1000000 for i in 1 1000000 output i
  • “导入日期时间”与“从日期时间导入日期时间”

    我有一个脚本需要在脚本中的不同行执行以下命令 today date datetime date today date time datetime strp date time string Y m d H M In my import我有以
  • 尝试让 powershell 在 C#/Visual Studio 中工作

    我试图学习如何在 C 中使用 powershell 我正在关注本教程 https blogs msdn microsoft com kebab 2014 04 28 executing powershell scripts from c 但
  • 有关于这种类型编程的文献吗?

    在大学里 我选修了一门现代物理学课程 我们在其中学习了狭义相对论 不同的参考系实际上可以观察到一个物体的物理属性是不同的 但又都是不正确的 这让我彻底震惊了 随着时间的推移 这个概念慢慢地改变了我的编程方式 现在我倾向于将类分为两个主要类别
  • 为什么 GCC 警告我这条线“被误导性地缩进,就好像它被 if 保护一样”?

    警告是 home dronz OF apps myApps HexMap src HexMap cpp 48 5 warning this if clause does not guard Wmisleading indentation i
  • 构建所有 csproj 文件,测试项目除外

    在 DevOps 中 您可以创建一个dotnet build任务 其中 项目路径 可以设置为 csproj建造所有项目 这工作得很好 但它 显然 也建立了我的 Test csproj项目 我发现一些帖子提到了排除模式 因此我尝试执行与这些帖
  • 如何在 Notepad++ 中排除双引号内的搜索模式

    我有以下行 我想用空格 制表符 替换空格 但想保留双引号内的空格 我在记事本 上 11 May 2020 10 10 20 0400 GET HTTP 1 1 302 523 52197 url com TLSv1 2 19922 Mozi
  • C++ 0 和 0.0 之间的区别

    C 中0和0 0有区别吗 您应该使用哪个来初始化双精度 Thanks 字面意义0被认为是一个int文字 文字0 0 is a double文字 当分配给一个double 两者都可以工作 因为int可以在扩大转换中进行铸造 然而 铸造0 0
  • 具有动态分区的 CTAS

    我想将包含文本格式的现有表更改为 orc 格式 我能够通过以下方式做到这一点 1 手动创建一个orc格式的表并进行分区 然后 2 使用INSERT OVERWRITE 语句填充表 我正在尝试为此使用 CTAS 创建表 AS Select 语
  • 如何在Javascript中组合多个字典?

    var dictA male 10 female 20 unassigned 30 var dictB male 11 female 21 unassigned 31 var dictC male 12 female 22 unassign
  • 如何在 C# 中打开平板电脑模式屏幕键盘?

    我想使用代码启动新的屏幕键盘 OSK 您可以在任务栏中找到这个 如果没有 您可以通过右键单击任务栏找到它 我已经尝试过常规的 System Diagnostics Process Start osk exe 但我想启动另一个 不是在窗口模式
  • java netcdf 4 教程

    我在这里使用 unidata 网站上最新的 netcdf jar 库 http www unidata ucar edu downloads netcdf index jsp http www unidata ucar edu downlo
  • 访问类受保护字段而不修改原始类

    我正在使用一些公开某些类型的第三方库 由方法返回 这种类型有一些我感兴趣的受保护字段 但是我无法使用它们 因为它们的可见性是受保护的 这是问题的简化 public class A protected object Something pub
  • 提交后挂钩失败(退出代码 3)并输出

    我正在尝试使用提交后脚本远程调用 Jenkins 作业 我目前正在通过 Eclipse Kepler Subversive SVNKit Connector 提交代码 提交后脚本 if svnlook dirs changed r REV
  • const 指针固定为变量

    我不知道如何告诉 C 我想要一个不会移动的指针 它将始终指向同一个数组 也就是说 数组成员不是恒定的 但数组本身是全局的 因此它位于固定位置 所以 当我编码时 include
  • 在没有 .plist 文件的情况下使用适用于 iOS 的 Google Analytics

    根据 Google 的文档 iOS 分析 他们希望您下载一些自动生成的 plist 文件来配置您的应用程序 不幸的是 我有多个报告套件 调试 发布 需要根据构建动态切换 所以我正在尝试做两件事之一 有没有办法完全放弃 plist 文件并动态
  • 构造函数继承和自定义构造函数

    使用这个层次结构 struct TestBase Constructor TestBase TestBase int a TestBase TestBase const testBase Destructor virtual TestBas