【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

news/2025/1/15 16:10:58/

文章目录

  • 一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则
    • 1、场景说明
    • 2、调用规则
  • 二、完整代码示例分析
    • 1、代码分析
    • 2、代码示例





一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则




1、场景说明


如果一个类

  • 继承了 基类 ,
  • 在类中 维护了一个 其它类型 的 成员变量 ,

那么 该类 的 构造 与 析构 , 就需要涉及到

  • 类 本身 的 构造函数 和 析构函数 ,
  • 父类 的 构造函数 和 析构函数 ,
  • 类 成员变量 的 构造函数 和 析构函数 ;

2、调用规则


在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下 :

  • 构造函数 : 父类 -> 成员 -> 自身 ;
    • 首先 , 调用 父类 构造函数 ;
    • 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型的 构造函数 ;
    • 最后 , 调用 自己 构造函数 ; 自身定义的 构造函数 ;
  • 析构函数 : 自身 -> 成员 -> 父类 ;
    • 首先 , 调用 自己 析构函数 ; 自身定义的 析构函数 ;
    • 然后 , 调用 成员 析构函数 ; 也就是 成员变量 类型的 析构函数 ;
    • 最后 , 调用 父类 析构函数 ;




二、完整代码示例分析




1、代码分析


在下面的代码中 ,

继承关系 : C 类 继承了 B 类 class C : public B , B 类 继承了 A 类 class B : public A ;

组合关系 : D 类 是一个普通类 , 在 C 类中维护了一个 D 类成员变量 ;

class C : public B {
public:C(int a, int b, int c) : B(a, b){this->z = c;cout << "C 构造函数调用" << endl;}~C(){cout << "C 析构函数调用" << endl;}
public:int z;D d;
};

可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数 , 成员变量 构造/析构函数 的调用顺序 ;

  • 构造函数调用顺序 : 父类 -> 成员 -> 自身 ;
  • 析构函数调用顺序 : 自身 -> 成员 -> 父类 ;

2、代码示例


代码示例 :

#include "iostream"
using namespace std;class A {
public:A(int a){this->x = a;cout << "A 构造函数调用" << endl;}~A(){cout << "A 析构函数调用" << endl;}
public:int x;
};class B : public A {
public:B(int a, int b) : A(a){this->y = b;cout << "B 构造函数调用" << endl;}~B(){cout << "B 析构函数调用" << endl;}
public:int y;
};class D
{
public:D(){cout << "D 构造函数调用" << endl;}~D(){cout << "D 析构函数调用" << endl;}
};class C : public B {
public:C(int a, int b, int c) : B(a, b){this->z = c;cout << "C 构造函数调用" << endl;}~C(){cout << "C 析构函数调用" << endl;}
public:int z;D d;
};int main() {C obj(1, 2, 3);cout << "obj.x = " << obj.x <<" , obj.y = " << obj.y <<" , obj.z = " << obj.z << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 : 下面的代码中 , 分析构造函数调用顺序 ;

  • A 和 B 的构造函数 , 是 父类构造函数 ;
  • D 构造函数 , 是 成员构造函数 ;
  • C 构造函数 , 是 自身构造函数 ;

构造函数的调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述的调用原则 ;

然后分析 析构函数 调用顺序 ;

  • C 析构函数 , 是 自身构造函数 ;
  • D 析构函数 , 是 成员构造函数 ;
  • A 和 B 的析构函数 , 是 父类构造函数 ;

析构函数的调用顺序为 : 自身 -> 成员 -> 父类 , 符合上述的调用原则 ;

A 构造函数调用
B 构造函数调用
D 构造函数调用
C 构造函数调用
obj.x = 1 , obj.y = 2 , obj.z = 3
Press any key to continue . . .
C 析构函数调用
D 析构函数调用
B 析构函数调用
A 析构函数调用

在这里插入图片描述


http://www.ppmy.cn/news/1172108.html

相关文章

比例运算放大电路为什么要加平衡电阻

这个是反相比例运算放大电路&#xff0c;输出电压等于-Rf/R1乘以输入电压。 这个是同相比例运算放大电路&#xff0c;输出电压等于1Rf/R1乘以输入电压。 大家可以看到这两个电路中&#xff0c;都有一个电阻R2&#xff0c;反相比例运算放大电路放在同相端到地&#xff0c;同相比…

GoLong的学习之路(四)语法之循环语句

书接上回&#xff0c;上回说到运算符&#xff0c;这次我们说一个编程语言中最重要的一点&#xff1a;流程控制&#xff0c;及循环语句 文章目录 循环语句if else(分支结构)if条件判断特殊写法 for(循环结构)for range(键值循环) switch casegoto(跳转到指定标签)break(跳出循环…

轻松修复缺少concrt140.dll,一键修复dll丢失问题

在电脑使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“由于找不到concrt140.dll无法继续执行代码”。这个问题可能是由于系统文件丢失、损坏或被病毒感染等原因引起的。为了解决这个问题&#xff0c;我整理了以下五个解决方案&#xff0c;希望能对…

拼团小程序制作技巧大揭秘:零基础也能轻松掌握

随着拼团模式的日益流行&#xff0c;越来越多的商家和消费者开始关注拼团小程序的制作。对于没有技术背景的普通人来说&#xff0c;制作一个拼团小程序似乎是一项艰巨的任务。但实际上&#xff0c;选择一个简单易用的第三方平台或工具&#xff0c;可以轻松完成拼团小程序的制作…

oninput和onchange事件有什么区别以及使用场景

oninput和onchange都是常见的表单元素的事件&#xff0c;它们的区别在于触发的时机不同。 oninput事件会在表单元素的值发生变化时立刻触发&#xff0c;无论是通过键盘输入、粘贴、剪切、拖拽等方式&#xff0c;都能实时响应。比如&#xff1a; <input type"text&quo…

IPD集成产品开发TR技术评审详解

IPD&#xff08;Integrated Product Development&#xff09;集成产品开发是一种跨部门协同的、利用先进技术和管理方法来快速推出新产品并满足客户需求的开发模式。华为利用IPD也非常出名。在IPD集成产品开发的过程中&#xff0c;TR&#xff08;Technical Review&#xff09;技…

RHCE---Shell基础 2

文章目录 目录 文章目录 前言 一.变量 概述 定义 自定义变量 环境变量 概述&#xff1a; 定义环境变量&#xff1a; 位置变量 "$*"会把所有位置参数当成一个整体&#xff08;或者说当成一个单词 变量的赋值和作用域 read 命令 变量和引号 变量的作用域 变…

Amazon图片下载器:利用Scrapy库完成图像下载任务

概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序&#xff0c;实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架&#xff0c;提供了许多方便的特性&#xff0c;如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…