复合&继承关系下的构造和析构

侯捷C++手把手教学:复合,委托,继承 Composition(复合),表示has-a(可以理解为外驻) Adapter(容器适配器) template <class T> class queue { //先进先出的队列 ... protected: deque<T> c; //底层容器,双端队列 public: //以下完全利用c的操作函数完成 bool empty() const { return c.empty(); } size_type size() co 阅读详情

继承关系下的构造和析构

看一下测试代码:

/*
 * @filename:    Inheritance.cpp
 * @author:      Tanswer
 * @date:        2018年01月31日 14:59:28
 * @description: 测试继承关系下的构造和析构
 */

#include<iostream>
using namespace std;

class Base
{
    public:
        Base(){
            cout << "Base ctor ..." << endl;
        }
        virtual ~Base(){
            cout << "Base dtor ..." << endl;
        }
};

class Derived:public Base
{
    public:
        Derived(){
            cout << "Derived ctor ..." << endl;
        }
        ~Derived(){
            cout << "Derived dtor ..." << endl;
        }
};

int main()
{
    Derived test;

    return 0;
}

代码描述了这样一种关系,如下:
这里写图片描述

继承表现为 is-a 的关系,举个例子人是哺乳动物,那么人具有哺乳动物的特征,所以将 Base 放在里面。

运行结果如下:

这里写图片描述

  1. 构造由内而外
    Derived 的构造函数首先调用 Base 的 default 构造函数,然后才执行自己的。
    代码类似这样:Derived::Derived(…): Base() { … }; 这是编译器加的,我们声明一个子类时不需要管。

  2. 析构由外而内
    Derived 的析构函数首先执行自己,然后才调用 Base 的析构函数。
    代码类似这样:Derived::~Derived(…) { … ~Base() }; 同上。

复合关系下的构造和析构

看一下测试代码:

/*
 * @filename:    Composition.cpp
 * @author:      Tanswer
 * @date:        2018年01月31日 15:06:21
 * @description: 测试复合关系下的构造和析构
 */

#include<iostream>
using namespace std;

class Component
{
    public:
        Component(){
            cout << "Component ctor ..." << endl;
        }
        ~Component(){
            cout << "Component dtor ..." << endl;
        }
};

class Container
{
    public:
        Container(){
            cout << "Container ctor ..." << endl;
        }
        ~Container(){
            cout << "Container dtor ..." << endl;
        }
        Component c;
};


int main()
{
    Container test;
    return 0;
}

复合表现为 has-a 的关系,如下:

这里写图片描述

运行结果如下:

这里写图片描述

  1. 构造由内而外
    Container 的构造函数首先调用 Component 的 default 构造函数,然后才执行自己的。
    代码类似这样:Container::Container(…): Component() { … };

  2. 析构由外而内
    Container 的析构函数首先执行自己,然后才调用 Component 的析构函数。
    代码类似这样:Container::~Container(…) { … ~Component() }; 同上。

继承和复合关系下的构造和析构

那么既有继承,又有复合呢?构造和析构顺序是什么样呢?

测试代码如下:

/*
 * @filename:    Inheritance.cpp
 * @author:      Tanswer
 * @date:        2018年01月31日 14:59:28
 * @description: 测试继承复合关系下的构造和析构
 */

#include<iostream>
using namespace std;

class Component
{
    public:
        Component(){
            cout << "Component ctor ..." << endl;
        }
        ~Component(){
            cout << "Component dtor ..." << endl;
        }
};
class Base
{
    public:
        Base(){
            cout << "Base ctor ..." << endl;
        }
        virtual ~Base(){
            cout << "Base dtor ..." << endl;
        }
        int n;
};

class Derived:public Base
{
    public:
        Derived(){
            cout << "Derived ctor ..." << endl;
        }
        ~Derived(){
            cout << "Derived dtor ..." << endl;
        }
        Component c;
};

int main()
{
    Derived test;

    return 0;
}

按照前面两种情况下的讨论,可以得到它们的关系如下:
这里写图片描述

问题在于里面部分的次序,谁先谁后,在我目前的环境下,运行结果如下:

这里写图片描述

也就是:

  1. 构造由内而外
    Derived 的构造函数首先调用 Base 的 default 构造函数,然后调用 Component 的 default 构造函数,然后才执行自己的。
    代码类似这样:Derived::Derived(…): Base() , Component() { … };

  2. 析构由外而内
    Derived 的析构函数首先执行自己,然后调用 Component 的析构函数,然后调用 Base 的析构函数。
    代码类似这样:Derived::~Derived(…) { … ~Component(), ~Base() }; 。

有疑问的可以自己测试一下,在析构和构造函数里打印点文字,来验证一下。其实也很好想,构造时从里面一层一层往外构造,拆除时肯定要从外面开始,一层一层的拆掉。

从0开始学GEE python——Google Earth Engine (GEE) 和 geemap 库来获取 Sentinel-2 卫星影像,并将其可视化 这段代码的目的是从 Sentinel-2 卫星影像中获取特定地点的影像,并将其可视化在地图上。通过设置合适的波段和可视化参数,用户可以清晰地查看该地区的卫星影像。 阅读详情

相关推荐

Openwifi 开源项目解读(一)

Openwifi wifi 80211 无线网卡 基带 FPGA linux 驱动 开源

2万+

继承(Inheritance)+复合(Composition)关系下的构造和析构

我们知道单一的继承或者复合关系的构造函数作用是从内到外,而析构是从外到内的。 那么同时拥有继承和复合关系的时候,构造函数与析构函数的作用顺序是怎么样呢,下面有事例代码来总结。 class Base { public: Base() { cout &lt;&lt; "Base 的 构造函数" &lt;&lt; endl; } ~Base() { cout &lt;&lt; "Base 的 析构函数" &lt;&lt; endl; } }; class Com.

hurryup的博客 407

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 546

C++ | 【03】类的【继承、多态、复合、委托】

文章目录一、继承1、概述2、访问控制3、继承中的构造和析构4、同名处理5、多继承6、菱形继承和虚继承 一、继承 1、概述 为了减少代码重复内容。 // 父类 class man{ } // 子类 class d :public man{ } 2、访问控制 public:不可访问私有属性; protected:把public都变成protected; private:把public和protected变成可访问的。 子类会继承父类的私有属性,但被编译器隐藏了,访问不到私有成员。 3、继承

weixin_45926547的博客 840

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

i2c转串口驱动移植

i2c转串口驱动移植欢迎使用Markdown编辑器新的改变思路与使用方式合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M

mars_Vessalius的博客 2276

04 C++面向对象(侯捷)——类与类的关系(复合,委托,继承三种基本关系)

本节主要阐述关于面向对象的内容,具体讲述了类与类之间的三种关系——复合(组合),委托,继承。

m0_51767556的博客 1146

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3723

C++学习进阶:继承

继承的示意图,我们在设定一个学生类和老师类的时候发现会有一部分代码复合,于是乎我们为了让两个类内部代码不要太多符合,设定了一个语法叫做继承,通过创造一个父类Person然后让Student和Teacher来继承那一部分共有的数据,来达到复用的目的。一般只能子类对象赋值给父类对象,而父类对象不能赋值给子类对象,并且中间过程不产生临时对象,就是子类的部分,父类会有,直接就赋值相等内容即可。2.默认情况下,对同名成员的访问,是直接访问子类,但是通过父类名以及域操作符 :: 来访问父类。

weixin_73234157的博客 215

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 144

C++复合与继承下的构造、析构过程。

继承中的构造与析构 举例子,构造(多层包装的过程)由内到外 先构造父类,在构造子类,这样才安全。 析构(箱子破坏拆开的过程)由外到内 复合中的构造与析构 同样先构造内部的,在构造外部的,析构先破坏外部,在破坏内部。 ...

远行的蜗牛 352

G.6 PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]_汀、的博客-优快云博客PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】_汀、的博客-优快云博客 PaddleHub--{超参优化AutoDL Finetuner}【二】_汀、的博客-优快云博客PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】_汀、的博客-优快云博客通过前面几篇文章大家都有一定了解,下面

丨汀、的博客 6185

侯捷 C++ 课程学习笔记:复合 & 继承关系下的构造和析构

复合(Composition)是一种“类包含类”的关系,即一个类作为另一个类的成员。复合关系的构造和析构规则:构造顺序:先构造成员变量,再构造自身。析构顺序:先析构自身,再析构成员变量(与构造顺序相反)。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 820

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 中复合与继承:构造与析构的奥秘

 在 C++ 中,复合和继承关系下的构造和析构函数调用规则是理解面向对象编程的重要基石 。复合关系中,构造函数从内到外调用,析构函数从外到内调用;继承关系里,构造函数先父类后子类,析构函数先子类后父类 。当复合与继承并存时,构造函数按照父类、成员对象、自身的顺序调用,析构函数则按照自身、成员对象、父类的顺序调用 。这些规则看似复杂,但却有着内在的逻辑和严谨性,它们确保了对象在创建和销毁过程中,各个部分都能被正确地初始化和清理,避免了内存泄漏和资源管理不当等问题。

大雨淅淅的博客 991

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【c++】继承和组合混搭下的构造和析构顺序

类和类之间有三种关系:①组合关系:has_a a part of的关系②继承关系:is_a a kind if的关系③代理关系:在容器适配器中,屏蔽底层的接口,对外提供新的特性 在只有的组合的关系中可直接调用构造;在继承中,先调用基类的构造,后调用派生类的构造;析构的时候只要记住,先构造的后析构,也就是先析构派生类,后析构基类即可。那么在有组合和继承混搭...

QX_a11的博客 601

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

继承(Inheritance)与复合(Composition)关系下的构造与析构

探究继承与复合关系下的构造与析构次序。

Corlin Blog 582

c++各类变量的生存周期、初始化和消亡顺序(复合、委托、构造)

先构造的后析构

hfwyydy的博客 708

复合,继承,委托

复合(Composition)复合其实是一种 has-a 的关系, 继承是 is-a 委托

qiaoyifan的博客 674

类之间的基本关系

类之间的复合关系 template &lt;class T, class Sequence = deque&lt;T&gt; &gt; class queue { ... protected: Sequence c; public: // 以下完全利用 c 的操作函數完成 bool empty() const { return c.empty...

diyudong4681的博客 175

C++对象模型分析-继承原理解析

讨论主题:分析C++继承关系的实现原理。 继承关系下的构造和析构 构造由内而外。先调用基类Base的构造函数,但后执行自己的构造函数。 析构由外而内。先析构自己,再调用Base的析构函数。 值得注意的,base class的析构函数需要申明为virtual,否则在析构时,派生类仅析构基类,而析构自身,可能导致内存泄漏。 class Base{ public: ...

m0_38076911的博客 300

C++继承-复合-委托

C++中的继承 复合 委托

weixin_43367756的博客 782

复合、委托、继承和虚函数

C++:复合,委托,继承和虚函数

C++的知识 209

【C++资源管理必修课】:析构函数调用顺序决定内存安全,90%开发者都忽略的细节

掌握C++资源管理关键细节,解析析构函数调用顺序如何保障内存安全。涵盖继承体系与栈对象的执行逻辑,揭示自动调用机制的优势与常见陷阱。理解这一核心规则,避免资源泄漏,提升程序稳定性,值得收藏。

BytePerch的博客 683

看 侯捷老师 C++ 面向对象编程的笔记

文章目录C++ 面向对象编程基于对象C 和C++class template 模板参数传递:pass by value 和 pass by reference返回值:pass by value 和 pass by referenceBig Three ,三个特殊的成员函数生命周期和作用域new 和delete 的关键字浅析array new 一定要搭配 array delete面向对象复合复合模式下的构造和析构构造函数调用——有内而外析构函数调用——由外而内委托(Delegation) Compositio

何亮5083的博客 327

析构函数调用顺序背后的真相,每个C++开发者都应掌握的核心知识

掌握析构函数的调用顺序,解决对象资源释放混乱问题。详解C++中继承与组合场景下的调用规则,揭示栈解栈与对象生命周期的关系。理解自动调用机制,避免内存泄漏。每个C++开发者都应掌握的核心知识,值得收藏。

PixelIsle的博客 459
上一篇: 编写网络服务程序的常用编程模型
下一篇: 无锁队列的原理和实现
Tanswer_
博客等级 码龄11年 231粉丝 91原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值