C++多继承构造函数调用顺序

2023-11-14

class B1 
{public:
 B1(int i) 
 {cout<<"consB1"<<i<<endl;}
};//定义基类B1
class B2  
{public:
 B2(int j) 
 {cout<<"consB2"<<j<<endl;}
};//定义基类B2
class B3 
{
public:
  B3()
  {cout<<"consB3 *"<<endl;}
};//定义基类B3
class C: public B2, public B1, public B3 
{public: 
  C(int a,int b,int c,int d,int e)
   :B1(a),memberB2(d),memberB1(c),B2(b)
  {m=e; cout<<"consC"<<endl;}
private:
 B1 memberB1;
 B2 memberB2;
 B3 memberB3;
 int m;
};//继承类C
void main()
{ C  obj(1,2,3,4,5);  }//主函数


运行结果:consB2 2 consB1 1 consB3 * consB1 3 consB2 4 consB3 * consC

//先按照继承顺序:B2,B1,B3 

//第一步:先继承B2,在初始化列表里找到B2(b),打印"constB22"

 //第二步:再继承B1,在初始化列表里找到B1(a),打印"constB11"

 //第三步:又继承B3,在初始化列表里找不到B3(x), 则调用B3里的默认构造函数B3(),打印"constB3 *" 

//再按照数据成员定义顺序:memberB1, memberB2, memberB3

 //第四步:在初始化列表里找到memberB1(c),初始化一个B1对象,用c为参数,则调用B1的构造函数,打印"constB13" 

//第五步:在初始化列表里找到memberB2(d),初始化一个B2对象,用d为参数,则调用B2的构造函数,打印"constB24" 

//第六步:在初始化列表里找不到memberB3(x),则调用B3里的默认构造函数B3(),打印"constB3 *" 

//最后完成本对象初始化的剩下部分,也就是C自己的构造函数的函数体:{m=e; cout<<"consC"<<endl;} 

 //第七步:打印"consC"

 回到你的主要问题:为什么会有两次B3*出现? 

第一次是由于继承了B3,虽然在C的构造函数的初始化列表里你没看到B3(x)或者B3(),但并不代表B3的构造函数没有在发挥作用。事实上,B3被隐性初始化了,因为B3的构造函数没有参数,所以写不写B3()都无所谓,这里恰好省略了。B1,B2则都是显性初始化,因为它们都需要参数。第二次是因为C有数据成员memberB3,又一次,你没有在C的构造函数的初始化列表里看到你希望出现的memberB3(),很显然,这又是一次隐性初始化。B3的构造函数再次被暗中调用。每一次B3的构造函数被调用,都会打印出“consB3 *”。两次被调用,自然打印两次“consB3 *”。

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

C++多继承构造函数调用顺序 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • IndexError: tuple index out of range

    1 如果想把CUDA tensor格式的数据改成numpy时 需要先将其转换成cpu float tensor随后再转到numpy格式 numpy不能读取CUDA tensor 需要将它转化为 CPU tensor 2 predicted
  • numpy tolist()的用法

    1 将数组或者矩阵转换成列表 如下 gt gt gt from numpy import gt gt gt a1 1 2 3 4 5 6 a1是列表 gt gt gt a2 array a1 列表 gt 数组 gt gt gt a2 arr
  • linux usb系统【全面】

    转自 http blog csdn net ljzcom article details 8574411 1 简述 USB 出自豪门 一问世便有 IBM Microsoft compaq 等前呼后拥 不红实在是没有道理 以致于连三岁小毛孩都
  • 利用Git连接远程仓库(详细步骤)

    利用Git连接远程仓库步骤及常见问题 1 先创建一个文件夹 名字为远程仓库的名称 2 在该文件目录下打开Git Bash 3 输入git init 进行初始化 初次连接时 4 连接远程仓库 初次连接是下一次进入该文件夹就不用了 输入下列命令
  • [528]attrib隐藏文件夹

    综述 小伙伴们总要有一些秘密是不能让别人知道的 之前我们使用的设置隐藏文件夹然后在控制面板设置不显示隐藏文件夹的方式都弱爆了 下面我们来用一种更高级的办法来设置隐藏文件夹 感受一下 设置隐藏 首先我们创建一个文件夹 比如名字叫 SECRET
  • 事务的实现原理

    事务的实现 简介 特性 ACID 状态与分类 实现机制 日志机制 redo log undo log 锁机制 如何使用 简介 有许多小伙伴初学事务还不太清楚是干什么的 那么我们在简介中一次性将事务给搞懂 首先我们先来简单的说一下事务是什么
  • nmap命令使用大全,详细清晰

    一 主机发现 全面扫描 综合扫描 nmap A 192 168 1 103 Ping 扫描 nmap sP 192 168 1 1 24 免 Ping 扫描 穿透防火墙 避免被防火墙发现 nmap P0 192 168 1 103 TCP
  • QNX系统+Crank的UI设计方案-qnx的HMI方案

    锋影 e mail 174176320 qq com 今天先把QNX Acceleration Kit验证一下
  • IDEA修改文件名和类名

    结果
  • 深入理解Direct3D9

    String Of Brilliant Blue QQ群 8082814 随笔 34 文章 32 评论 136 博客园 首页 新随笔 联系 管理 深入理解Direct3D9 深入理解D3D9对图形程序员来说意义重大 我把以前的一些学习笔记都
  • 正则高级应用

    案例 最近在使用notepad 做sql格式化 select from 之间的逗号后面的数据进行换行再加一个制表符 直接一个正则表达式搞定 s from SELECT biz date SUM bigorder add consum 1m
  • 索引设计原则

    索引设计原则 代码先行 索引后上 尽量先把业务sql写完 根据sql来看看如何建索引 联合索引尽量覆盖条件 比如可以设计一个或者两三个联合索引 尽量少建单值索引 联合索引尽量覆盖 mysql一般只会选一个索引走 很多where可能只走一个
  • org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apac

    本人刚接触shiro 自己进行测试 发现报错 小白一个希望大佬们多多指点 在这跟大家说一下可能不是你们的错误 但是是我的错非常稀奇 好博客的解决方法都试了不管用 最后慢慢查慢慢看 我的错是 在走进到realm时的执行dao层方法时报这个错误
  • flutter dio 请求方式为form-data遇到的问题

    在网络中请求body中有三种方式 postbody query formdata 如下图 现在我们用的恰好是第一种方式 因为首次用这种方式 感觉也是比较坑 后面通过摸索 查看源码发现 需要用fromdata方式包装进去放到请求参数中 正确的
  • 电子元器件知识---三极管

    一 三极管 三级管可以实现这样的控制 当基级没有电流时 它是截止的 而当基极有了电流 三极管就导通了 接下来 简单阐述一下 它为什么能够实现这样的功能 下图是NPN型三极管的示意图 我们知道 硅原子外面含有4个电子 纯净的硅晶体并不导电 因
  • 前端面试思维导图,面试流程注意事项

    前端面试思维导图 前端面试有着一图足矣
  • 计算机网络笔记一(计算机网络基本概念、TCP/IP协议体系)

    1 计算机网络基础概念 1 1计算机网络定义 计算机网络就是互连的 自治的计算机集合 自治 无主从关系 互连 互联互通 1 2什么是Internet Internet是最大的计算机网络 1 2 1从组成细节的角度 由很多个ISP网络互连的网
  • Jira实战

    什么是问题类型 问题类型是为了在请求之间起到简单区别的作用 范例 缺陷 任务 功能 等等 属性 名称 描述 类型 标准类型 父 或子类型 子 图标 好处 图标在筛选器 仪表盘 面板和邮件通知上提供了视觉上的区别 你可以为每一个类型设定一个标
  • 学习笔记 JavaScript ES6 ES6中的类与继承

    学习内容 类的定义 类的继承 静态属性和方法的定义 ES6中 用class关键字声明一个类 class Peple constructor name age this name name this age age showName cons
  • C++多继承构造函数调用顺序

    class B1 public B1 int i cout lt lt consB1 lt