c++ 继承 和 组合

目录

一. 继承

1.1 继承的概念

1.2 继承定义

1.3 继承类模板

1.4. 继承中的作用域

二. 派生类(子类)的默认成员函数

 2.1 概念:

2.2 实现⼀个不能被继承的类

2.3 继承与友元

2.4继承与静态成员

三.多继承及其菱形继承问题

3.1继承方式:

3.2 虚继承

四.继承和组合 


一. 继承

1.1 继承的概念


继承(inheritance)机制是⾯向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数) 和 属性(成员变量),这样产生新的类,称派生类


1.2 继承定义


下⾯我们看到Person是基类,也称作父类。man是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)

继承的结构

对比 访问限定符 和 继承方式:

继承方式的作用:

基类 的private的任何成员 都无法被访问

继承方式为 public子类 可以使用 父类的protect 和 public 成员

继承方式为 protected时子类 可以使用 父类的protect 和 public 成员

具体来说:

  • protected: 只有在该类及其子类中可以访问,外部类不能访问。
  • public: 可以在任何地方访问,不受限制。

(在实际运用中⼀般使用都是public继承)!!!
 

1.3 继承类模板

自定义的类 可以继承 库里面的类

比如 : 


1.4. 继承中的作用域

1.4.1 隐藏规则:


1. 在继承体系中 基类 和  派生类  都有独立的作用域
2. 派生类和基类中有同名成员,派生类成员将 屏蔽 基类对同名成员的 直接访问!,这种情况叫隐藏。(在派生类成员函数中,可以使用基类::基类成员显示访问
3. 需要注意的是如果是成员函数的隐藏只需要 函数名相同! 就构成隐藏
4. 注意在实际中在继承体系里面最好不要定义同名的成员

比如:自动调用b的fun,因为A类的自动隐藏了      

这个也构成隐藏 

    


二. 派生类(子类)的默认成员函数

 2.1 概念:

1. 派生类的构造函数 必须调用基类的构造函数 初始化基类的那⼀部分成员。如果 基类没有默认的构造函数,则必须派生类构造函数 的初始化列表阶段显示调用
2. 派生类的 拷贝构造函数 必须调用基类的拷贝构造 完成 基类的拷贝初始化。
3. 派生类的析构函数 会在被调用 完成后 自动调用 基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
4. 派生类 对象初始化先调用基类构造 再调 派生类构造。(先父后子 构造)
5. 派生类 对象析构 清理先调用派生类析构 再 调基类的析构 。(先子后父 析构)
6. 因为多态中⼀些场景析构函数需要构成重写,重写的条件之⼀是函数名相同。那么编译器会对析构函数名进行特殊处理,处理成destructor(),所以基类析构函数不加 virtual的情况下,派生类的 析构函数和基类的析构函数构成隐藏关系。

2.2 实现⼀个不能被继承的类


方法1:让基类的构造函数私有,派生类的构成必须调用 基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。
方法2:C++11新增了⼀个final关键字,final修改基类,派生类就不能继承了。

2.3 继承与友元

友元关系不能继承,也就是说基类的友元  不能访问  派生类的私有和保护成员


2.4继承与静态成员


基类定义了static静态成员,则整个继承体系里面只有⼀个这样的成员。无论派生出多少个派生类,都只有⼀个static成员实例


三.多继承及其菱形继承问题
 

3.1继承方式:

3.1单继承:⼀个派生类只有⼀个直接基类时称这个继承关系为单继承:


3.2多继承
:⼀个派生类有两个或 以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前面后面继承的基类在后面派生类成员在放到最后面:


3.3菱形继承:菱形继承是多继承的⼀种特殊情况。菱形继承的问题,从下面的对象成员模型构造,可以看出菱形继承有数据冗余和⼆义性的问题,在Assistant的对象中Person成员会有两份。支持多继承就⼀定会有菱形继承,像 Java就直接不支持多继承,规避掉了这里的问题,所以实践中我们也是不建议设计出菱形继承这样的模型的


3.2 虚继承

 概念 : 虚继承(Virtual Inheritance)是面向对象编程中的一个概念,主要用于C++等编程语言中,解决多重继承时可能出现的“菱形继承”问题。

使用virtual关键字,可以实现虚继承。

它可以 避免了重复的基类对象。这样做能够确保类的设计更加清晰,减少内存的使用和运行时的二义性问题。


四.继承和组合 


4.1 public继承是⼀种 is-a的关系。也就是说每个派生类对象都是⼀个基类对象。

继承:


4.2 组合是⼀种 has-a的关系。假设B组合了A,每个B对象中都有⼀个A对象。

组合:



• 优先使用组合,而不是继承。实际尽量多去用组合,组合的耦合度低,代码维护性好。不过也不太那么绝对,如果 类之间的关系就适合继承(is-a)那就用继承,另外要实现多态,也必须要继承。

如果 类之间的关系 既适合用继承(is-a)也适合组合(has-a),就用组合

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

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

相关文章

市场调研利器 网络问卷的优势及面临的挑战

网络问卷作为市场调研工具,高效便捷、成本低廉、数据准确度高且灵活多样。但其低响应率、数据偏差、隐私与安全及技术依赖等挑战也需关注。企业应优化调研方法,应对挑战,以获取全面市场信息。 一、网络问卷的优势 首先,我们来分析…

sheng的学习笔记-AI-时序差分学习

AI目录:sheng的学习笔记-AI目录-CSDN博客 强化学习:sheng的学习笔记-AI-强化学习(Reinforcement Learning, RL)-CSDN博客 蒙特卡罗强化学习: sheng的学习笔记-AI-蒙特卡罗强化学习-CSDN博客 什么是时序差分学习 时序…

毕业设计选题:基于ssm+vue+uniapp的校园订餐小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高,相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域,通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来,我国政府高度…

python 高效读取多个geojson 写入一个sq3(Sqlite) 、效率提高90%+

1.问题缘由: 由于工作需求,需要将多个(总量10G)geojson文件写入到sq3库,众所周知,sqlite 不支持多线程写入,那该怎么办呢,在网上也查了很多策略,都没有达到立竿见影的效果…

工控主板在工业控制中扮演什么角色

工控主板在工业控制中扮演着至关重要的角色,它是工业控制系统的核心组件,负责连接、控制和管理各种工业设备,实现自动化生产和智能化管理。具体来说,工控主板在工业控制中的作用可以归纳为以下几个方面: 一、核心控制…

年龄性别与手势识别系统源码分享

年龄性别与手势识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

计算机视觉学习路线:从基础到进阶

计算机视觉学习路线:从基础到进阶 计算机视觉(Computer Vision)是人工智能和机器学习领域中重要的分支,致力于让计算机能够理解和分析图像、视频等视觉信息。随着深度学习的发展,计算机视觉的应用变得越来越广泛&…

Python 解析 html

一、场景分析 假设有如下 html 文档&#xff1a; 写一段 python 脚本&#xff0c;解析出里面的数据&#xff0c;包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…

基于Qt/C++UDP 调试软件功能及用途介绍

概述 UDP 调试软件是一个基于 Qt 框架的图形化应用程序&#xff0c;旨在提供一个简单易用的界面用于测试和调试 UDP&#xff08;用户数据报协议&#xff09;通信。该软件支持客户端和服务器模式&#xff0c;能够实现数据的发送和接收&#xff0c;方便开发者和网络工程师进行网…

牛顿迭代法求解x 的平方根

牛顿迭代法是一种可以用来快速求解函数零点的方法。 为了叙述方便&#xff0c;我们用 C C C表示待求出平方根的那个整数。显然&#xff0c; C C C的平方根就是函数 f ( x ) x c − C f(x)x^c-C f(x)xc−C 的零点。 牛顿迭代法的本质是借助泰勒级数&#xff0c;从初始值开始快…

C++ | Leetcode C++题解之第438题找到字符串中所有字母异位词

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> findAnagrams(string s, string p) {int sLen s.size(), pLen p.size();if (sLen < pLen) {return vector<int>();}vector<int> ans;vector<int> count(26);for (int i …

828华为云征文|基于华为云Flexus X实例部署Uptime-Kuma服务器监控面板

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 重置密码 2.3 登录服务器 三、Flexus X安装uptime-kuma面板 3.1 uptime-kuma介绍 3.2 uptim…

【频分复用】5G中OFDM和GFDM的比较(频谱效率、误码率、星座图、复杂度)【附MATLAB代码及报告】

微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;554073254 背景 5G需要满足低延迟、高数据速率、连接密度和其他应用需求&#xff0c;这些应用需要增强的移动的宽带、超可靠和低延迟连接以及海量机器类型连接[1]。这种通信所需的信道容量受到噪声、衰减、失真和符号间…

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…

TypeScript 设计模式之【策略模式】

文章目录 策略模式&#xff1a;灵活切换算法的导航系统策略模式的奥秘策略模式有什么利与弊?如何使用策略模式来优化你的系统代码实现案例策略模式的主要优点策略模式的主要缺点策略模式的适用场景总结 策略模式&#xff1a;灵活切换算法的导航系统 当你使用导航软件规划路线…

如何使用ssm实现北关村基本办公管理系统的设计与实现

TOC ssm721北关村基本办公管理系统的设计与实现jsp 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活质量。…

【教学类-18-04】20240508《蒙德里安“黑白格子画” 七款图案挑选》

背景需求 最近有2位客户买了蒙德里安黑白格子画的素材&#xff0c;其中一位问是否是1000张。 【教学类-18-03】20240508《蒙德里安“红黄蓝黑格子画”-A4横版》&#xff08;大小格子&#xff09;_processing简单图形画蒙德里安-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞35次…

基于小波变换与稀疏表示优化的RIE数据深度学习预测模型

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在通过深度学习模型进行RSOP&#xff08;Remote Sensing Observation Prediction&#xff09;的数据预测。RSOP数据是基于远程传感技术采集的多维信息&#xff0c;广泛应用于…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…