C++:带内嵌对象成员的派生类的构造函数,析构函数的声明方式与执行的先后顺序

2023-11-02

声明了某个带内嵌对象成员的派生类的对象并进行初始化时,我们要使用到派生类的构造函数,在这时,派生类的构造函数会调用内嵌对象、父类(基类)的构造函数,那么,这些构造函数的执行顺序是什么呢?

我们知道,被继承的类可以被叫做父类或基类,因此它作为构造派生类的基础,应该在调用构造函数时具有最高的优先顺序,紧接着是内嵌的对象成员,最后才是派生类自己的构造函数。当一个派生类具有多个父类(基类),多个内嵌对象成员时,在调用构造函数时始终遵循:父类构造函数>内嵌对象构造函数,然后再根据其在声明派生类时出现的先后顺序来执行。

对于析构函数的调用顺序,就记住与构造函数调用的顺序相反即可。

下面来看个程序示例:

#include<iostream>
#include<string>
using namespace std;
class A {
protected:
	int a;
	float b;
public:
	A(int a1,int b1) {
		a = a1;
		b = b1;
		cout << "调用A的构造函数" << endl;
	}
	void showA() {
		cout << "a=" << a << " b=" << b << endl;
	}
	~A() {
		cout << "调用A的析构函数" << endl;
	}
};
class B{
protected:
	string c;
	float d;
public:
	B(string c1, float d1) :c(c1), d(d1) //使用成员初始化列表
    {
		cout << "调用B的构造函数" << endl;
	}
	void showB();
	~B();
};
void B::showB() {
	cout << "c=" << c << " d=" << d << endl;
}
B::~B() {
	cout << "调用B的析构函数\n";
}
class C :public A, public B {
private:
	string e;
	B bb;
public:
	C(int a1, int b1, string c1, float d1, string c2,float d2,string e1);//注意派生类构造函数在类外定义时的格式
	void showC();
	~C();
};
C::C(int a1, int b1, string c1, float d1, string c2, float d2, string e1) :A(a1, b1), B(c1, d1),bb(c2,d2) {
	e = e1;
	cout << "调用C的构造函数" << endl;
}
C::~C() {
	cout << "调用C的析构函数" << endl;
}
void C::showC() {
	showA();
	showB();
	bb.showB();
    cout<<"e="<<e<<endl;
}
int main() {
	C cc(1, 2, "CHINA", 5.0, "GOOD", 4.8, "BEST");
	cc.showC();
	return 0;
}

为了展示声明构造函数格式的多样化,我采用了“在类内声明,在类外定义”,以及“类内声明并定义”,“使用成员初始化列表”的方式来展现格式多样化。

其中,各个类的析构函数由于不需要参数,故派生类的析构函数在声明并定义时不需要像其构造函数一样;

运行结果如下:

调用A的构造函数
调用B的构造函数
调用B的构造函数
调用C的构造函数
a=1 b=2
c=CHINA d=5
c=GOOD d=4.8
e=BEST
调用C的析构函数
调用B的析构函数
调用B的析构函数
调用A的析构函数

结果验证了前面的说法。

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

C++:带内嵌对象成员的派生类的构造函数,析构函数的声明方式与执行的先后顺序 的相关文章

  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 在静态断言和运行时错误之间自动选择

    我有一个执行除法并检查对齐的宏 define BYTES TO WORDS x CHECK ALIGNMENT x 2 x 2 我想实施CHECK ALIGNMENT作为一个总是返回 1 的宏 并且如果满足以下条件则触发错误x不除以 2 宏
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • Rx Framework:在超时时执行操作,而不中断原始可观察序列

    给定一个可观察的源 通过轮询低级设备的 变化 状态生成 observable source metacode IObservable
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • 接口中的私有成员

    是否可以在 NET 接口中创建私有成员 我听说现在可以了 但我的 IDE 拒绝了 public interface IAnimal void SetDefaultName string name ChangeName name privat
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 在 C# 中使用 as 关键字与泛型类型发生冲突的编译时行为

    当尝试对无法转换为的非泛型类型使用 C as 关键字时 编译器会给出无法转换类型的错误 但是 当对泛型类型使用 as 关键字时 编译器不会给出错误 public class Foo public class Bar
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐

  • 【100%通过率 】【华为OD机试 c++/java/python】对称字符串【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 对称美学 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第
  • resetlog

    来自于itpub的一篇文章 http space itpub net 16628454 很多人说 resetlogs就是不完全恢复 这是不对的 做不完全恢复必须使用resetlogs 但resetlogs也可以做完全恢复 而noresetl
  • # 第四届蓝桥杯JavaB组省赛-马虎的算式

    第四届蓝桥杯JavaB组省赛 马虎的算式 题目描述 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 4
  • 解决idea文件properties中文乱码问题

    有时候将项目代码拉取至本地用idea打开时会出现中文乱码问题 遇到这种问题不要慌 重新设置一下编码为UTF 8即可 那么如何将idea的编码统一设置为UTF 8格式呢 接下来我们一一解决此类问题 1 打开idea编译器 有时候会看到打开的文
  • WebGIS工程师进阶训练营

    WebGIS工程师进阶训练营 1 WebGIS课程综述 2 多类情景部署SuperMap iServer 2 1 Linux环境部署SuperMap iServer 2 2 war包部署 2 3 常见问题排查 3 SuperMap iSer
  • word添加、更新目录

    1 显示导航窗口 视图 导航窗口 2 文档中的目录 2 1 插入目录 引用 目录 2 2 更新目录 方式一 点击下图 更新目录 方式二 引用 更新目录
  • WinForm使用鼠标裁剪图像

    之前做一个试卷识别的项目的时候需要预先将各个部分裁剪开然后进行识别 而网上的裁剪函数都是记录鼠标的位置然后进行裁剪 public static Bitmap PartDraw Image src Rectangle cutpart 切割图片
  • (休息几天)读米什金之货币银行学——货币与汇率

    1货币 当一国货币升值时 相对于其他货币价值上升 则该国商品在国外变得更贵 而外国商品唉本国则变得更便宜 相反 一国货币贬值 则该国商品在国外更便宜 而外国商品在本国则变得更贵 货币升值使得本国制造的商品在国外竞争力下降 而国外商品在本国竞
  • Koa2.js router 异步返回ctx.body失效的问题

    koa2 js 用router返回数据时 正常写法如下 我是将接口封装了 一个很普通的koa2 js get请求 router put getUserInfo ctx next gt const data ctx request body
  • PHP自己的框架2.0版本目录结构和命名空间自动加载类(重构篇一)

    目录 1 目录结构演示效果 2 搭建目录结构 以及入口public gt index php 3 引入core下面core gt base php 4 自动加载实现core gt fm gt autoload php 5 框架运行文件cor
  • Basic Level 1012 数字分类 (20分)

    题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1 A 1 A1 能被 5 整除的数字中所有偶数的和 A 2
  • matlab 取余(rem)和取模(mod)的区别

    取余 rem 和取模 mod 的区别 Matlab 生成机制 取余 采取fix 函数 向0方向取整 取模 采取floor 函数 向无穷小方向取整 当A B异号时 其实同号也是这个规律 取余 结果和A同号 取模 结果和B同号 PS 在js c
  • ASP .net core 整合 nacos 通过Spring Cloud Gateway 网关访问

    ASP net core 整合 nacos 通过Spring Cloud Gateway 网关访问 使用vs创建web项目 选择api 注意这里要取消掉Https配置否则使用网关转发也需要配置为https请求这里我们直接取消 添加nacos
  • WebRTC实现多人视频聊天

    写在前面 实现房间内人员的视频聊天 由于并未很完善 所以需要严格按照步骤来 当然基于此完善 就是时间的问题了 架构 整个设计架构如下 图片来自于参考博文 我使用的是第一种Mesh 架构 无需任何流媒体服务器 直接利用成熟的WebRTC 协议
  • windows10进程查询命令、端口占用查询命令、杀进程命令

    windows环境下编码开发经常遇到端口占用问题 解决时需要找到对应进程杀掉 释放占用 自己常用的几项操作命令如下 首先 打开Windows的命令窗口 键盘 win R 输入cmd 回车 1 查询端口被占用的进程 命令 netstat ao
  • 马虎的算式 有一次,老师出的题目是:36 x 495 = ?他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!!

    马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类似这样
  • 信息传递【NOIP2015】【强连通分量 Tarjan】

    题目链接 题目描述 有 n 个同学 编号为 1 到 n 正在玩一个信息传递的游戏 在游戏里每人都有一个固定的信息传递对象 其中 编号为 i 的同学的信息传递对象是编号为Ti的同学 游戏开始时 每人都只知道自己的生日 之后每一轮中 所有人会同
  • python链家新房信息获取练习

    使用python对链家新房相关数据进行爬取 并进行持久化存储 文章目录 前言 一 页面分析 二 代码编写 1 数据库表的建立 2 代码编写 结果 前言 保持练习 以下是本篇文章正文内容 下面案例可供参考 一 页面分析 老样子进行页面分析 u
  • 解决在win10下DNS_PROBE_FINISHED_BAD_CONFIG问题

    解决在win10下DNS PROBE FINISHED BAD CONFIG问题 打开控制面板 进入 网络和 Internet 进入 网络和共享中心 进入 更改适配器设置 选择当前使用的网络链接适配器 点击 属性 选择 Internet协议
  • C++:带内嵌对象成员的派生类的构造函数,析构函数的声明方式与执行的先后顺序

    声明了某个带内嵌对象成员的派生类的对象并进行初始化时 我们要使用到派生类的构造函数 在这时 派生类的构造函数会调用内嵌对象 父类 基类 的构造函数 那么 这些构造函数的执行顺序是什么呢 我们知道 被继承的类可以被叫做父类或基类 因此它作为构