高程 | 继承与派生(c++)

文章目录

  • 📚继承的概念和语法
  • 📚派生类生成过程
  • 📚继承权限和继承方式
    • 🐇公有继承
    • 🐇私有继承
    • 🐇保护继承
  • 📚类型转换规则
  • 📚派生类构造函数和析构函数
  • 📚继承中的静态成员特性
  • 📚虚继承和虚基类

📚继承的概念和语法

  • ⭐️概念
    • 类的继承,是新的类从已有类那里得到已有的特性
    • 类的派生,从已有类产生新类的过程
    • 原有的类称为基类或父类,产生的新类称为派生类或子类。
    • 直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。
  • ⭐️语法
    • class 派生类名:[继承方式] 基类名{undefined 派生类新增加的成员};
      • 若是多继承则有class 派生类名:继承方式1 基类名1,继承方式2 基类名2,…
      • 每一个“继承方式”,只用于限制对紧随其后之基类的继承。
    • 基类是已有类的名称。
    • 派生类是继承原有类的特性生成的新类的名称。
    • 继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。

📚派生类生成过程

  • ⭐️吸收基类成员:吸收基类成员之后,派生类实际上就包含了它的全部基类中除构造和析构函数之外的所有成员。
  • ⭐️改造基类成员
    • 访问控制问题,由定义时的继承方式控制。
    • 覆盖隐藏
      • 如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。
      • 所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。
      • 基类成员函数和派生类成员函数不构成重载
        • 基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解。
        • 对于成员函数,不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样
    • 如果在派生类中需要且仅需要重写其中一个重载函数,该如何操作?
      • 通过using在派生类中为父类函数成员提供声明 即添加 “ using Base::print; ”
      • 通过基类指针调用(进阶办法:把在派生类中需要重载的那个版本相应地在基类中声明为vitual)
  • ⭐️添加新的成员:在定义时直接添加就好。

📚继承权限和继承方式

  • 不同继承方式的影响主要体现在:
    • 派生类成员对基类成员的访问权限。
    • 通过派生类对象对基类成员的访问权限。

🐇公有继承

  • 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象只能访问基类的public成员。

🐇私有继承

  • 基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。

🐇保护继承

  • 基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。
  • 特点和作用
    • 对建立其所在类对象的模块来说,它与 private 成员的性质相同。这意味着只有在类内部或者友元函数中才能访问保护继承的成员。这样可以实现数据隐藏,防止外部模块直接访问变量或函数。
    • 对于其派生类来说,它与 public 成员的性质相同。这意味着派生类可以直接访问和使用保护继承的成员,但是对外部模块来说是不可见的。这样可以方便继承,派生类可以重用保护继承的成员,实现代码的重用。既实现了数据隐藏,又方便继承,实现代码重用。

在这里插入图片描述
在这里插入图片描述


⭐️private, public, protected 三类访问标号的访问范围

  • private属性:
    • 只能由①该类中的函数、②其友元函数访问。
    • 该类的对象不能访问。
  • protected属性:
    • 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。
    • 该类的对象不能访问。
  • public属性:
    • 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。
    • 该类的对象可以访问。
  • 无论是哪种继承方式,基类的私有成员在派生类中都是不可被访问的。只能通过基类的成员函数访问基类的私有数据成员。 如果在一个派生类中要访问基类中的私有成员,可以将这个派生类声明为基类的友元。

📚类型转换规则

  • 一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:
    • 派生类的对象可以隐含转换为基类对象。
    • 派生类的对象可以初始化基类的引用。
    • 派生类的指针可以隐含转换为基类的指针。
  • 通过基类对象名、指针只能使用从基类继承的成员。

📚派生类构造函数和析构函数

  • 基类的成员函数可以被继承,可以通过派生类的对象访问;
  • 类的构造函数不能被继承。在派生类的构造函数中调用基类的构造函数。Student::Student(char *name, int age, float score): People("小明", 16), m_score(score){ }
  • 派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的
    • 当基类中没有显式定义构造函数,或定义了无参构造函数时,派生类构造函数的初始化表可以省略对基类构造函数的调用,而采用隐含调用。
    • 当基类的构造函数使用一个或多个参数时,派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。
    • 定义构造函数时,需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。这时,派生类构造函数的函数体可能为空,仅起到参数传递作用。
    • 如果在基类中既定义了无参构造函数,又定义了带参构造函数,则在定义派生类构造函数时,既可以包含基类构造函数和参数,也可以不包含基类构造函数。

  • 和构造函数类似,析构函数也不能被继承。(不用程序员显示调用、编译器负责)
  • ⚠️执行顺序
    • 基类构造函数的调用顺序是按照派生类定义时的顺序。
    • 内嵌对象的构造函数调用顺序是按照成员在类中声明的顺序。
    • 先执行基类构造函数,再执行内嵌对象的构造函数。
    • 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。

📚继承中的静态成员特性

  • 均被继承到派生类中。
  • 重新定义静态成员函数,基类中的其他函数会被隐藏。
  • 改变基类中的一个函数特征(返回值、参数个数),则使用该函数名的基类版本均会被隐藏。

📚虚继承和虚基类

  • 多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。(容易产生问题,命名冲突。)
    在这里插入图片描述

  • 虚继承(Virtual Inheritance)为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。在继承方式前面加上virtual关键字就是虚继承。

    • 形式举例
      • 间接基类A:class A{protected: int m_a;};
      • 直接基类B:class B: virtual public A{ //虚继承protected: int m_b;};
    • 虚继承的目的:让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)
    • 虚继承时的构造函数:
      • 虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。
      • 这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
    • 关于虚继承的说明
      • 当使用虚继承时,虚基类是共享的,无论被继承多少次,对象内存中只有一个虚基类子对象。其初始化也只能由一个类初始化一次。
      • C++标准中要求每次继承之类中均需要写初始化语句,但虚基类的初始化是由最后的子类完成,其他初始化子类均不会调用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

互联网加竞赛 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习机器视觉的…

SpringBoot实战:打造企业资产管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

php 数组函数

php 数组函数 1. 常用的php数组函数 1. 常用的php数组函数 array_pop() 删除数组中最后一个元素 array_push() 将一个或多个元素插入到数组的末尾 array_keys <?php $arr array("刘岩" > 30, "范冰冰" > 31, "娜扎" > 31);$…

制作一个入耳式耳机壳需要用到哪些材料和工艺流程呢?

制作一个入耳式耳机壳需要用到以下材料和工艺流程&#xff1a; 材料&#xff1a; 耳机壳材料&#xff1a;常用的有PC/ABS塑料、金属、陶瓷、木质等。不同材料具有不同的特性&#xff0c;如塑料轻便耐用、金属质感好、陶瓷高档、木质自然等。耳塞材料&#xff1a;常用的有硅胶、…

自学ESPIDF(一)点个灯

不废话&#xff0c;万物皆从点灯开始。 espidf的examples里有个blink&#xff0c;作为测试再好不过了。 /* Blink ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissof…

模仿 STM32 驱动开发格式实验

1.模仿 STM32 寄存器定义 为了开发方便&#xff0c; ST 官方为 STM32F103 编写了一个叫做 stm32f10x.h 的文件&#xff0c;在这个文件 里面定义了 STM32F103 所有外设寄存器&#xff0c;我们可以使用其定义的寄存器来进行开发&#xff0c;比如我 们可以用如下代码来初始…

【regex】正则表达式

集合 [0-9.] [0-9.\-] 例子 正则表达式&#xff0c;按照规则写&#xff0c;写的时候应该不算困难&#xff0c;但是可读性差 不同语言中regex会有微小的差异 vim 需要转义&#xff0c; perl/python中不需要转义 锚位 \b am\b i am 命名 [0-9.\-] (?<ta>[0-9.\-]) …

机器学习中为什么需要梯度下降

在机器学习中&#xff0c;梯度下降是一种常用的优化算法&#xff0c;用于寻找损失函数的最小值。我们可以用一个简单的爬山场景来类比梯度下降的过程。 假设你被困在山上&#xff0c;需要找到一条通往山下的路。由于你是第一次来到这座山&#xff0c;对地形不熟悉&#xff0c;你…

微服务学习Day4

文章目录 初始MQ同步通讯和异步通讯MQ常见技术介绍 RabbitMQ快速入门入门案例 SpringAMQP介绍例子WorkQueue模型exchange交换机消息转换器 初始MQ 同步通讯和异步通讯 MQ常见技术介绍 RabbitMQ快速入门 入门案例 SpringAMQP 介绍 例子 WorkQueue模型 exchange交换机 消息转换…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传&#xff0c;请敬请期待 很多⼈在处理分类变量时都会遇到很多困难&#xff0c;因此这值得⽤整整⼀章的篇幅来讨论。在本章中&#xff0c;我将 讲述不同…

分享几种免费获取SSL证书方式

自2018年七月开始&#xff0c;Chrome将所有未安装使用SSL证书的网站皆标记为“不安全”。在访问未安装部署SSL证书网站时经常会出现风险提示&#xff0c;而拥有SSL证书的网站在权重排名上会有一定提升。 当然网站部署SSL证书最主要的意义还是在于网络安全防范和普及https&#…

【IDEA关闭项目一直转圈】

IDEA关闭项目一直转圈&#xff1a; IDEA启动时&#xff0c;会自动打开上次关闭时所有显示的窗口&#xff0c;如果本次工作不需要上次打开的所有窗口&#xff0c;可以基于选择窗口界面的右上角去关闭。 项目关闭失败 但是偶尔会出现窗口关闭时&#xff0c;一直显示“正在关闭项…

Ubuntu学习笔记-禅道从windows迁移到ubuntu中。

文章目录 一、备份Windows下的数据1.1 备份Windows下的mysql数据库数据1.1.1 找到禅道安装目录下的mysql文件路径。1.1.2 执行mysqldump指令备份数据库1.1.3 将数据库备份文件拷贝到ubuntu服务器中。二、ubuntu下配置禅道2.1 ubuntu安装禅道2.1.1 点击禅道下载,然后搜索12.5.3…

前端面试必备八股文——HTMLCSS

HTML src和href的区别 src和href都是用来加载外部资源&#xff0c;区别如下 src当浏览器解析到该元素时&#xff0c;会暂停其他资源的加载和处理&#xff0c;直到该资源加载完成。 它会将资源内容嵌入到当前标签所在的位置&#xff0c;将其指向的资源下载应用到文档内&#…

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…

关于虚拟化的一切

茶还是咖啡&#xff1f; Xbox 还是 PlayStation&#xff1f; Chrome 还是 Firefox&#xff1f; 我们习惯于做出棘手的选择。在云计算中&#xff0c;选择 Linux 还是 Windows 也不例外&#xff0c;通常涉及成本、灵活性和项目特定要求。虽然 Linux 具有开源和经济高效的优势&…

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F 理想架构的Doherty功率放大器理论与仿真中已经介绍了如何在ADS中使用理想电流源来对DPA的架构进行仿真。但是理想的电流源太理想了&#xff0c;电压、电流的许多行为都是需要自己使用数学公式去严格定义&#x…

集团企业大数据应用:突破痛点,释放数据价值

在数字经济日益崛起的背景下&#xff0c;集团企业以其管理范围广泛、业务领域多元化和分支机构复杂化的特性&#xff0c;在市场竞争中扮演着重要角色。为了维持和提升这种竞争力&#xff0c;大数据应用成为了集团企业不可或缺的战略工具。然而&#xff0c;在实际应用中&#xf…

武汉灰京文化浅谈手游崛起的新游戏时代

随着智能手机性能的不断提升&#xff0c;手游正逐渐迈向与主机和PC游戏相媲美的领域。高性能处理器、强大的图形处理能力以及智能化技术的融合&#xff0c;使得手游可以实现更高画质和更流畅的操作体验。而虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xf…