高程 | 继承与派生(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++标准中要求每次继承之类中均需要写初始化语句,但虚基类的初始化是由最后的子类完成,其他初始化子类均不会调用。

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

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

相关文章

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明。我查看了参考资料,又去查阅了官方文档,凭着我的理解整理了以下文档。各位大神的文档写的很好,但都不喜欢断句啊,读的我这叫一个累。 参考 1.网络编程之网络丢包…

IDEA工程与模块管理

一、IDEA项目结构 层级关系: project(工程) - module(模块) - package(包) - class(类)具体的: 一个project中可以创建多个module一个module中可以创建多个package一个package中可以创建多个class二、Project和Module的概念 在 IntelliJ IDEA 中&…

机器学习——聚类问题

📕参考:西瓜书ysu老师课件博客(3)聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理: k均值算法算法流程: 2.2 基于…

GD32F303VET6裸板调试遇到问题

1、开始串口中断的时候会死机:nvic_irq_enable(USART0_IRQn, 3, 0); 解决:要设置中断优先级分组: nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0); 2、初始化的时候多几次使用 printf 会HardFault_Handler: 解决:因为RTOS中…

《剑指offer》

本专题是分享剑指offer的一些题目,开始刷题计划。 二维数组的中的查找【https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId13&tqId11154&ru/exam/oj】 描述 在一个二维数组array中(每个一维数组的长度相同&#xff0…

大端和小端传输字节完整版

大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…

论文阅读 - Non-Local Spatial Propagation Network for Depth Completion

文章目录 1 概述2 模型说明2.1 局部SPN2.2 非局部SPN2.3 结合置信度的亲和力学习2.3.1 传统正则化2.3.2 置信度引导的affinity正则化 3 效果3.1 NYU Depth V23.2 KITTI Depth Completion 参考资料 1 概述 本文提出了一种非局部的空间传播网络用于深度图补全,简称为…

边缘计算:重塑数字世界的未来

引言 随着物联网(IoT)设备的激增和5G网络的普及,我们正站在一个计算模式的新纪元门槛上——边缘计算。这一技术范式将数据处理和分析推向网络的边缘,即设备或终端,为实时性要求较高的应用提供了前所未有的可能性。 目…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号: T 002 。 \color{red}{本文项目编号:T002。} 本文项目编号:T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

2024春节联欢晚会刘谦魔术分析

春晚已经越来越拉胯了,看着节目单没一个能打的,本来想说:办不起,就别办呗。 没想到第二天刘谦的魔术以一种很奇特的姿势火起来了,干脆蹭个热度,分析下魔术的原理。 魔术1 这个不算什么新奇的节目&#xf…

春晚后台撒贝宁意外“踩高跷”,尼格买提内增高秘密笑翻全场。

♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 龙年春晚无疑是观众们热议的焦点!除了尼格买提表演…

Spring Task定时任务

目录 1、介绍 2、cron表达式 2.1、在线生成器 2.2、通配符 3、代码示例 3.1、使用步骤 3.2、 代码开发 3.3、测试 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发…

windows vs 自己编译源码 leveldb 然后使用自己编译的文件

1 准备源码文件 1.1 第一种方法 git下载源码 vs项目中git leveldb源码和git third_party googletest-CSDN博客 1.2 第二种方法 手动下载 然后把第三方的源码下载 复制到 third_party 对应的文件夹中 没有文件夹 third_party -> powershell mkdir third_party 2 编译lev…

数据库第二次实验

目录 1 实验内容 2 SQL代码及运行截图 2.1 创建表并插入数据 2.1.1 创建表 2.1.2 插入数据 2.1.3 运行截图 2.2 修改表 2.2.1 SQL代码 2.2.2 运行截图 2.3 删除操作 2.3.1 SQL代码 2.3.2 运行截图 2.4 数据库的备份 2.5 数据库的恢复 1 实验内容 实验目的&#…

SG3225EEN晶体振荡器规格书

SG3225EEN 晶振是EPSON/爱普生的一款额定频率25 MHz至500 MHz的石英晶体振荡器,6脚贴片,LV-PECL输出,3225封装常规有源晶振,具有小尺寸,轻薄型,高稳定性,低相位抖动,低电源电压&…

零基础怎么学编程,免费版中文编程工具下载及构件用法教程

零基础怎么学编程,免费版中文编程工具下载及构件用法教程 一、前言 今天给大家分享的中文编程开发语言工具资料如下: 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程工具及实例源码文件下载可以点击最下方官网…

如何给最小化安装的CentOS主机装个远程桌面?

正文共:888 字 18 图,预估阅读时间:1 分钟 前面我们领微软云Azure的免费主机时(白嫖党618福利!来Azure领200美刀!外加云主机免费用一年!),发现“有资格免费试用服务”的主…

飞天使-k8s知识点19-kubernetes实操4-资源调度 标签和选择器:Label与Selector的使用-版本回退

文章目录 添加label资源调度 Deployment:创建与配置文件解析rs pod deploy 的关联信息展示Deployment:滚动更新Deployment:回滚回退版本实际操作 添加label [rootkubeadm-master1 test]# kubectl get pod NAME …

鸿蒙开发系列教程(二十一)--轮播处理

轮播处理 Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示 在自身尺寸属性未被设置时,会自动根据子组件的大小设置自身的尺寸 参数: 通过loop属性控制是否循环播放,该属性默认值为tr…

Recovering a Small String-Codeforces

题目链接&#xff1a;Problem - A - Codeforces 解题思路&#xff1a;分三种情况 第一个字母a,最后一个字母z 前两个字母a 最后两个字母z 其他根据大小算出剩下的字母 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t, n;cin…