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

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(使用前将#替换为@)

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

  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 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