类的关系 继承(Inheritance)、聚合(Aggregation)和关联(Association)

前言

在面向对象编程中,类之间的关系主要有以下几种:继承(Inheritance)、聚合(Aggregation)和关联(Association)。每种关系在对象的创建和销毁时,构造函数和析构函数的调用顺序都会有所不同。下面我将分别解释这些关系,并举例说明构造函数和析构函数的调用顺序。

继承关系

继承是面向对象编程的四大特性之一,它允许一个类(派生类/子类)继承另一个类(基类/父类)的属性和方法。

构造函数和析构函数调用顺序

  • 构造对象时,先调用基类的构造函数,再调用派生类的构造函数。
  • 销毁对象时,先调用派生类的析构函数,再调用基类的析构函数。

示例

#include<iostream>
class Base {  
public:  Base() { std::cout << "Base constructor\n"; }  ~Base() { std::cout << "Base destructor\n"; }  
};  class Derived : public Base {  
public:  Derived() { std::cout << "Derived constructor\n"; }  ~Derived() { std::cout << "Derived destructor\n"; }  
};  int main() {  Derived d; // 输出:Base constructor, Derived constructor  // 当d离开作用域时  // 输出:Derived destructor, Base destructor  return 0;  
}

聚合关系

聚合是一种“拥有”关系,表示一个对象是另一个对象的组成部分。聚合通常通过包含指向其他对象的指针或引用实现。

构造函数和析构函数调用顺序

  • 构造对象时,先构造被包含的对象,再构造包含它的对象。
  • 销毁对象时,先销毁包含它的对象,再销毁被包含的对象。

示例

#include<iostream>
class Part {  
public:  Part() { std::cout << "Part constructor\n"; }  ~Part() { std::cout << "Part destructor\n"; }  
};  class Whole {  
private:  Part part;  
public:  Whole() { std::cout << "Whole constructor\n"; }  ~Whole() { std::cout << "Whole destructor\n"; }  
};  int main() {  Whole w; // 输出:Part constructor, Whole constructor  // 当w离开作用域时  // 输出:Whole destructor, Part destructor  return 0;  
}

关联关系

关联关系表示两个类之间的某种联系,这种联系可以是单向的也可以是双向的,通常通过指针或引用实现。

构造函数和析构函数调用顺序

  • 关联关系本身并不直接决定构造函数和析构函数的调用顺序,因为这取决于具体的实现和对象的创建/销毁顺序。
  • 一般来说,当你创建或销毁一个对象时,与之关联的对象的构造函数或析构函数可能在任何时刻被调用,这取决于你如何在代码中管理这些对象。

示例

#include<iostream>
class ClassA {  
public:  ClassA() { std::cout << "ClassA constructor\n"; }  ~ClassA() { std::cout << "ClassA destructor\n"; }  
};  class ClassB {  
private:  ClassA* a;  
public:  ClassB() {  a = new ClassA(); // 输出:ClassA constructor  std::cout << "ClassB constructor\n";  }  ~ClassB() {  delete a; // 输出:ClassA destructor  std::cout << "ClassB destructor\n";  }  
};  int main() {  ClassB b; // 输出:ClassA constructor, ClassB constructor  // 当b离开作用域时  // 输出:ClassB destructor, ClassA destructor  return 0;  
}

这个关联关系的示例中,ClassB内部使用了一个指向ClassA的指针。因此,在构造ClassB对象时,我们首先构造ClassA对象,然后在ClassB的构造函数体中输出自己的构造函数信息。类似地,在销毁ClassB对象时,我们首先输出自己的析构函数信息,然后销毁ClassA对象。

请注意,关联关系中的对象创建和销毁顺序完全取决于你如何在代码中实现它们。上述示例中的顺序是基于在ClassB的构造函数中创建ClassA对象,并在ClassB的析构函数中销毁它。如果你在不同的地方或不同的时间创建和销毁这些对象,那么构造函数和析构函数的调用顺序也会相应改变。

继承 ,关联, 聚合都有的时候 ,构造函数 ,析构函数的调用顺序

当一个类同时涉及到继承、关联和聚合关系时,构造函数和析构函数的调用顺序会基于这些关系的组合变得更为复杂。下面我将通过一个具体的例子来说明这种情况下的构造函数和析构函数的调用顺序。

假设我们有以下三个类:

  • Base 类作为基类。
  • Derived 类继承自 Base 类,同时包含一个指向 Associated 类的指针,表示关联关系。
  • Associated 类包含一个 Aggregated 对象,表示聚合关系。

示例

#include<iostream>
class Aggregated {  
public:  Aggregated() { std::cout << "Aggregated constructor\n"; }  ~Aggregated() { std::cout << "Aggregated destructor\n"; }  
};  class Associated {  
private:  Aggregated aggregated; // 聚合关系  
public:  Associated() { std::cout << "Associated constructor\n"; }  ~Associated() { std::cout << "Associated destructor\n"; }  
};  class Base {  
public:  Base() { std::cout << "Base constructor\n"; }  virtual ~Base() { std::cout << "Base destructor\n"; }  
};  class Derived : public Base { // 继承关系  
private:  Associated* associated; // 关联关系  
public:  Derived() {  associated = new Associated(); // 创建关联对象  std::cout << "Derived constructor\n";  }  ~Derived() {  delete associated; // 销毁关联对象  std::cout << "Derived destructor\n";  }  
};  int main() {  Derived d; // 创建 Derived 对象  // 输出顺序:  // Base constructor  // Aggregated constructor  // Associated constructor  // Derived constructor  // 当 d 离开作用域时  // 输出顺序:  // Derived destructor  // Associated destructor  // Aggregated destructor  // Base destructor  return 0;  
}

在这个例子中:

  1. 当创建 Derived 类的对象时:
    • 首先调用基类 Base 的构造函数。
    • 接着在 Derived 的构造函数体内,创建 Associated 类的对象。由于 Associated 类中包含一个 Aggregated 对象,因此在创建 Associated 对象时,会首先调用 Aggregated 的构造函数。
    • 然后调用 Associated 的构造函数。
    • 最后调用 Derived 的构造函数。
  2. 当 Derived 的对象离开作用域时:
    • 首先调用 Derived 的析构函数。
    • 接着在 Derived 的析构函数体内,销毁 Associated 类的对象。在销毁 Associated 对象时,会首先调用 Associated 的析构函数。
    • 然后由于 Associated 类中包含一个 Aggregated 对象,所以在 Associated 的析构函数执行完后,会调用 Aggregated 的析构函数。
    • 最后调用基类 Base 的析构函数。

这个例子展示了当类之间同时存在继承、关联和聚合关系时,构造函数和析构函数的调用顺序。记住,构造函数的调用顺序是从基类到派生类,再到聚合和关联的对象;而析构函数的调用顺序则是相反的,从派生类到基类,再到聚合和关联的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题日记:面试经典 150 题 DAY5

刷题日记&#xff1a;面试经典 150 题 DAY4 125. 验证回文串28. 找出字符串中第一个匹配项的下标151. 反转字符串中的单词6. Z 字形变换68. 文本左右对齐 125. 验证回文串 原题链接 125. 验证回文串 双指针&#xff0c;一前一后&#xff0c;遇到非数字字母跳过即可 class So…

腾讯云哪款服务器最便宜划算?2024腾讯云服务器优惠价格表

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

TCP三次握手四次挥手

目录 TCP报文 ☞ 标志位 TCP状态变迁图&#xff1a; 三次握手 为什么要三次握手&#xff1f; 客户端与服务端接口状态 客户端&#xff1a; 服务端&#xff1a; 第一次握手&#xff1a; 第二次握手&#xff1a; 第三次握手&#xff1a; 四次挥手&#xff1a; 四次挥…

火爆全网,软件测试数据库常用 SQL 语句总结,你要的我都有......

前言 直接上干货 数据定义语言(DDL) 主要负责数据库、数据表、视图、键、索引等结构化的操作 常用的语句有&#xff1a;CREATE DATABASE、CREATE TABLE、ALTER TABLE等 字段的常用约束有&#xff1a;PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT 常…

onnx模型优化利器onnxoptimizer、onnxsim

ONNX性能优化和调试技巧 - 知乎ONNX模型是一种跨平台、跨框架的模型表示格式,允许用户在不同的深度学习框架之间共享模型和数据,从而加速模型开发和部署。然而,在实际应用中,我们通常需要对ONNX模型进行性能优化和调试,以确保其在不同硬件和…https://zhuanlan.zhihu.com/…

PTA L2-011 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历&#xff0c;请你先将树做个镜面反转&#xff0c;再输出反转后的层序遍历的序列。所谓镜面反转&#xff0c;是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&…

android 快速实现 圆角矩形控件 及 圆形控件

1.自定义RoundImageView package com.examle.widget;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import an…

CIP通讯介绍(欧姆龙PLC)

什么是CIP CIP通信是Common Industrial Protocl(CIP)的简称&#xff0c;它是一个点到点的面向对象协议&#xff0c;能够实现工业器件&#xff08;传感器&#xff0c;执行器&#xff09;之间的连接&#xff0c;和高等级的控制器之间的连接。目前&#xff0c;有3种网络DeviceNet…

MySQL--优化(索引--索引创建原则)

MySQL–优化&#xff08;索引–索引创建原则&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、索引创建原则 我们使用的索引种类&#xff1a; 主键索引唯一索引根据业务创建的索引&#xff08;复…

怎么给视频活码加入时间设置?限时扫码看视频的制作方法

视频二维码是常见的一种二维码类型&#xff0c;很多人会通过这种方式来分享视频内容&#xff0c;可能某些情况下需要对制作的二维码图片加入扫码限制&#xff0c;比如有效期、填写密码、限制预览时间等设置&#xff0c;那么这些需求怎么在生成二维码时实现呢&#xff1f; 对于…

JAVA 用二分法查找数组中是否存在某个值

二分法查找的概念 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。首先&#xff0c;将表中间位置记录的关键字与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成功&#xff1b;否则利用中间位置记录将表分成…

软考67-上午题-【面向对象技术2-UML】-UML简介

一、UML简介 1-1、UML的定义 UML——统一建模语言。 能够表达软件设计中的动态、静态信息。 交互图&#xff1a;表达动态信息&#xff1b; 静态图&#xff1a;表达静态信息。 1-2、UML由3个要素构成&#xff1a; UML的基本构造块&#xff1b;&#xff08;仅讨论此要素&…

spring-security 项目实战(一)个人健康档案

spring-security 项目实战&#xff08;一&#xff09;个人健康档案 项目说明项目地址框架信息 代码分析配置类解析默认登录页登录接口执行逻辑登录认证成功之后重定向到main页面过程未登录之前访问 /main生成默认登录页点击登录 登录之后访问 /main执行流程清空认证信息 项目来…

低空经济20人|卓翼智能任雪峰:以技术驱动市场,引领无人机细分领域创新

作为国内系留无人机领域的领头羊企业&#xff0c;卓翼智能致力于提供智能无人系统解决方案。本期“低空经济20人”请到卓翼智能CEO任雪峰分享他对系留无人机研发应用的经验以及未来无人机行业生态发展的观点。 如今&#xff0c;无人机的应用场景逐渐广泛&#xff0c;在社会发展…

python的http服务的使用

在Python中&#xff0c;你可以使用内置的 http.server 模块来创建一个简单的HTTP服务器。这个模块提供了一个轻量级的HTTP服务器&#xff0c;适用于开发和调试。以下是一个简单的例子&#xff1a; # Python 3.x from http.server import SimpleHTTPRequestHandler from sockets…

18个惊艳的可视化大屏(第20辑):物联网场景

实时监控和管理 物联网系统通常涉及大量的传感器、设备和数据&#xff0c;通过将这些数据可视化展示在大屏上&#xff0c;可以实时监控和管理物联网系统的运行状态。这有助于及时发现问题、快速响应&#xff0c;并提高系统的可靠性和稳定性。 数据分析和决策支持 可视化大屏可…

软件测试--性能测试实战篇

软件测试--性能测试实战篇 项目介绍和部署1. 轻商城项目介绍1.1 背景1.2 简介2. 项目功能架构3. 项目技术架构4. 熟悉数据库设计5. 轻商城项目搭建5.1 准备工作5.2 项目搭建步骤性能测试需求分析1. 性能测试需求分析1.1 如何获取有效的需求2. 性能测试点的提取2.1 性能测试点的…

frida常用检测点及其原理

文章转载于&#xff1a;https://bbs.kanxue.com/thread-278145.htm frida常见反调试 查看哪个so在检测frida function hook_dlopen() {Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),{onEnter: function (args) {var pathptr args[0];i…

死锁的四个必要条件怎么理解

简单介绍 死锁是指在多线程或多进程的环境中&#xff0c;两个或多个进程或线程相互等待对方所持有的资源而无法继续执行的情况。死锁发生时&#xff0c;各个进程或线程都无法继续执行&#xff0c;系统处于僵持状态。 死锁发生的四个必要条件是&#xff1a; 互斥条件&#xff0…

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例

吴用说只有公孙胜可以破法术&#xff0c;于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经&#xff0c;于是到了二仙山&#xff0c;并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州&#xff0c;公孙胜说听师傅的。罗真人说出家人不管闲事&a…