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.xdnf.cn/news/1544891.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

yolov10算法原理

文章目录 1. 模型效果2. 模型特点2.1 无NMS训练的一致性双重分配策略 (Consistent Dual Assignments for NMS-free Training)双重标签分配 (Dual Label Assignments)一致匹配度量(Consistent Match. Metric)一对一分配在一对多结果中的频率 2.2. 效率-准…

电场(electric-field)

图中: Q 产生电场的正电荷(可正可负,这里用正举例)q 试验电荷,正电荷(习惯上用正电荷)p 试验电荷所在的位置(即要测的电场强度的位置)r 为电荷间的距离 r ^ \widehat{r}…

[js逆向学习] fastmoss电商网站——店铺排名

逆向目标 网站:https://www.fastmoss.com/shop-marketing/tiktok接口:https://www.fastmoss.com/api/shop/shopList/参数:fm-sign 逆向分析 我们今天要分析的是店铺排名,先分析网络请求,找到目标接口 按照上图操作…

怎样批量对比两个数据库的表差异??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

38.重复的子字符串

方法1: class Solution {public boolean repeatedSubstringPattern(String s) {if (s.equals("")) return false;String s2(ss).substring(1,(ss).length()-1);//去掉首尾字符return s2.contains(s);//判断是否包含s} } class Solution(object):def rep…

spring boot项目对接人大金仓

先确认一下依赖 第一 是否引入了mybatis-plus多数据源&#xff0c;如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…

接触器和复合开关的具体应用区别

接触器和复合开关在电力系统中都有各自的应用&#xff0c;但它们的功能和用途有所不同&#xff1a; 一、接触器 1、应用&#xff1a; 电动机控制&#xff1a;接触器常用于控制电动机的启停&#xff0c;能够承载电动机的启动电流。 自动控制系统&#xff1a;在自动化控制系统…

2-102基于matlab的蒙特卡洛仿真

基于matlab的蒙特卡洛仿真&#xff0c;对64QAM和BPSK进行蒙特卡洛仿真&#xff0c;并绘出误码率曲线。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a; 2-102基于matlab的蒙特卡洛仿真

【FPGA必知必会】(二)7系列的配置(一)

配置概述 7系列FPGA是通过将bitstream下载到内存中来实现配置的。 既可以通过外部非易失性存储器加载&#xff0c;也可以通过微处理器、DSP处理器、微控制器、PC或者板级测试仪进行加载。 有两种通用的配置路径&#xff0c;一种是串行数据路径&#xff0c;用于减少对器件引脚…

数据丢失不再怕!四款神器助你找回一切

哈喽&#xff0c;大家好&#xff01;今天咱们来聊聊数据恢复工具&#xff1b;在数字化的时代&#xff0c;数据丢失可是个让人头疼的问题&#xff1b;不过别担心&#xff0c;有了这些数据恢复工具&#xff0c;再也不用担心数据不见&#xff1b;下面我给大家推荐五款非常好用的数…

【systemctl start jenkins】启动报错问题解决

问题说明&#xff0c;最终是在jenkins.service中配置JAVA_HOME解决的&#xff0c;但是我的服务器环境中确定已经配置好了Java环境变量&#xff0c;并且java -version也能正常打印信息&#xff0c;不清楚为什么jenkins.service无法读取配置 1.环境配置说明 服务器&#xff1a;…

如何确定SAP 某些凭证或者单号的号码编码范围的 OBJECT 是什么?

在SAP的运维或者项目实施中&#xff0c;有时会如何确定SAP 某些凭证或者单号的号码 OBJECT 是什么&#xff1f; 一般一下常用的可以通过事务代码 例如&#xff1a; XDN1 Create Number Ranges for Customer Accounts&#xff0c;定义客户编码FBN1查看维护会计凭证号范围 我…

破解 oklink 网站加密数据(升级版)

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地分析并破解 oklink 网站加密数据 特别声明:本篇文章仅供学…

屏幕演示工具 | 水豚鼠标助手 v1.0.7

水豚鼠标助手是一款功能强大的屏幕演示工具&#xff0c;专为Windows 10及以上系统设计。这款软件提供了多种实用功能&#xff0c;旨在增强用户的屏幕演示体验&#xff0c;特别适合教师、讲师和需要进行屏幕演示的用户。鼠标换肤&#xff1a;软件提供多种鼠标光标样式&#xff0…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日&#xff0c;以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…

跑lvs出现soft connect怎么处理?

首先&#xff0c;我们先了解一下什么是soft connect。简而言之&#xff0c;就是工具会将所有连接在psub上的信号认作soft connect&#xff08;也就是short&#xff09;。如图1所示&#xff0c;VSS和AVSS都接到了p上&#xff0c;它们通过psub便有了soft connect。 如果有soft co…

SQLServer运维实用的几个脚本

目录 1、查询出最近所有耗时最大的SQL语句 2、查询数据库每个数据表存储占用 3、当前正在执行的最耗时的前10个SQL语句 4、SQLServer查看锁表和解锁 5、快速清理数据库日志文件 1、查询出最近所有耗时最大的SQL语句 返回的是未关联任何特定对象的最耗费资源的查询信息,包…

剖解相交链表

相交链表 思路&#xff1a;我们计算A和B链表的长度&#xff0c;求出他们的差值&#xff08;len&#xff09;&#xff0c;让链表长的先多走len步&#xff0c;最后在A,B链表一起向后走&#xff0c;即可相逢于相交节点 实现代码如下&#xff1a; public class Solution {public …

string 的介绍及使用

一.string类介绍 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&a…

服务设计原则介绍

在Java或任何软件开发中&#xff0c;设计服务时遵循一些核心原则是非常重要的&#xff0c;这些原则不仅有助于构建高质量、可维护的软件系统&#xff0c;还能提高系统的可扩展性和可重用性。以下是一些关键的服务设计原则&#xff1a; 单一职责原则&#xff08;SingleResponsib…