C++:面向对象三大特性之一:继承

继承

  • 1.继承理解
  • 2.继承方式引起访问变化
    • 表格
    • 表格理解
  • 3.赋值转换
    • 1.普通对象赋值
    • 2.继承对象赋值:赋值转换
      • 注意
  • 4.继承的作用域
  • 5.派生类默认成员函数
    • 1.构造函数
    • 2.析构函数
    • 3.拷贝构造
    • 4.赋值重载
  • 6.继承与友元
  • 7.继承与静态成员

1.继承理解

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

继承关系可以理解为is a的关系,即子类是一个特殊的父类。

比如学生是一种人,老师是一种人,狗是动物等。

在这里插入图片描述

2.继承方式引起访问变化

表格

在这里插入图片描述

表格理解

1.对于父类中的私有成员,无论何种继承,在子类中都不可见。(即虽然被继承到了子类,但是不能在子类内和子类外直接使用)
2.默认的权限大小:public > protected > private
3.对于继承后权限的变化,即:继承方式的权限与父类成员的原权限的最小值
4.和private相比,父类protected成员是只能在子类中使用,而子类对象无法在子类外使用,因此可以看出访问限定符因为继承关系而出现。
5.class类默认的继承方式是private,struct类默认的继承方式是public,但是建议把继承方式显示写出来。

3.赋值转换

1.普通对象赋值

在我们之前的学习中,会有不同类型的值赋值时,如果可以赋值,会产生临时变量,是将临时变量进行赋值。

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

临时变量具有常性,因此如果需要用引用接收时,需要加const。

2.继承对象赋值:赋值转换

在继承中,子类继承了父类之后再对其进行扩展。那么子类就会有父类有的那一部分。

子类对象对父类对象赋值时,不会产生临时变量,而是直接将继承父类的那一部分赋值过去。

注意

1.子类对象可以赋值给父类的对象,指针,引用。赋值给对象:将子类中继承父类的那一部分赋值给父类对象。赋值给指针:指针指向子类中继承父类的那一部分。赋值给引用:该父类引用是子类中继承父类的那一部分的别名2.父类对象不能赋值给子类对象3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(RunTime Type Information)的dynamic_cast 来进行识别后进行安全转换。(先了解即可)

在这里插入图片描述
示例:

class Person
{
public:void Print(){cout << "name:" << _name << " age:" << _age << endl;}string _name = "张三"; // 姓名int _age = 18; // 年龄
};class Student : public Person
{
public:void Print(){cout << "name:" << _name << "   age:" << _age << endl;}
protected:int _stunum = 110;// 学号
};int main()
{Student st;st.Print();Person p = st;p._name += "xxxx";p._age++;p.Print();Person* ptr = &st;ptr->_name += "x";ptr->_age++;Person& ref = st;ref._name += "y";ref._age++;st.Print();return 0;
}

输出结果:
在这里插入图片描述

4.继承的作用域

1.父类和子类都有各自的类域

2.隐藏(重定义)

​ 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问。

​ 子类和父类中有同名函数就构成隐藏,不需要函数的返回值参数这些相同。

注意:同名函数的隐藏不是函数重载!!!函数重载是在同一个域中,而父类和子类具有各自的类域。

3.对于隐藏的成员或者成员函数,可以通过基类::基类成员 显示访问

4.如果子类中没有该成员或成员函数,则直接访问,不需要再进行指定(注意访问权限的限制)

示例:

class Person
{
public:void func(){cout << "I am a person" << endl;}void Print(){cout << "name:" << _name << " age:" << _age << endl;}string _name = "张三"; // 姓名int _age = 18; // 年龄
};
class Student : public Person
{
public:void Print(){cout << "name:" << _name << "   age:" << _age << endl;Person::Print(); //指定类域func(); //由于子类中没有,因此不需要指定类域}
protected:string _name = "李四";int _stunum = 110;// 学号
};
int main()
{Student st;st.Print();st.Person::Print();
}

输出结果:
在这里插入图片描述

5.派生类默认成员函数

首先我们要明白:继承的父类成员等为一个整体,我们可以将其理解成为一个类成员!!!

下面对于子类的默认成员函数的行为进行梳理:

1.构造函数

子类的构造函数会去调用父类的构造函数来初始化自己继承的父类的那一部分,如果父类有默认构造函数则会去调用其的默认构造函数,如果父类没有就需要在子类的初始化列表部分显式调用父类的构造函数。

构造函数调用顺序:先父后子

显式调用格式:父类类名(参数)

2.析构函数

子类的析构函数在结束时会自动调用父类的析构函数。这样是为了保证析构的顺序是先子后父。

析构函数调用顺序:先子后父

注意:子类的析构函数会隐藏父类的析构函数。

虽然父类的析构函数和子类的析构函数看起来函数名不同,但是它们仍然构成隐藏,因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同,因此编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。

3.拷贝构造

子类的拷贝构造需要调用父类的拷贝构造进行完成(在初始化列表处)。

4.赋值重载

子类的赋值重载对于父类那部分必须显式调用父类的赋值重载,因为它们构成了隐藏,如果不显示调用,那么子类的赋值重载就会一直调用子类的赋值重载,那么就会栈溢出。

6.继承与友元

这里只需要知道一个点:

友元关系不能继承,就像你爸的朋友不是你的朋友一样。

7.继承与静态成员

这里只需要知道一个点:

父类的静态成员属于父类和其所有的子类。即整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。

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

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

相关文章

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

spring事务@Transactional

定义一个项目测试 spring 的事务支持情况 项目准备 创建一个名为 mybatis-transaction 的 spring boot 2.x 项目&#xff0c;引入 mybatis 的依赖&#xff0c;如下 使用 spring 官网的脚手架生成项目 https://start.spring.io/ 下载完毕后 pom.xml 如下 <?xml version&quo…

【GPTs分享】GPTs分享之 AskYourPDF Research Assistant​

一、简介 AskYourPDF Research Assistant 是一款高级人工智能研究助手&#xff0c;专门设计用于帮助用户高效从PDF文件和文章中提取信息。它结合了深度学习技术和自然语言处理能力&#xff0c;以便用户能够快速地查询、总结及处理文档内容&#xff0c;并能够生成与文章内容相关…

Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理

随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了r…

Nginx防盗链:资源保护新利器,拒绝盗链行为!

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Nginx防盗链是一种安全机制&#xff0c;用于防止其他网站直接链接到你的网站上的资源&#xff08;如图片、视频、文件等&#xff09;&#xff0c;从而避免不必要的带宽消耗…

P1278 单词游戏 简单搜索+玄学优化

单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词&#xff0c;并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍&#xff0c;游戏中只能使用给定词典中含有…

Linux 操作系统指令和Vscdoe安装

1、Linux系统介绍 Linux系统的背景介绍我就不介绍了&#xff0c;有兴趣的可以去看看其发展史。 1.1 Linux操作系统的主要特点 Linux操作系统的重要思想&#xff1a;一切皆文件 Linux操作系统的特性&#xff1a; 完全免费 支持多平台 支持多用户、多任务 有良好的界面 完美兼容…

温湿度LCD显示并上传服务器

项目需求 通过温湿度传感器将值传到LCD1602&#xff0c;并实时通过蓝牙透传到手机。 硬件介绍 温湿度传感器 DHT11温湿度传感器 DHT11_温湿度传感器数据格式-CSDN博客 LCD1602LCD1602-CSDN博客 HC-01 继电器模块 硬件接线 LCD1602 D0~D7 --> A0~A7VDD, A --> 5v…

STM32H750外设ADC之双重 ADC 模式

目录 概述 1 双重 ADC 模式介绍 1.1 双重 ADC模式 1.2 双重 ADC 模式的类型 2 双重 ADC 模式寄存器的配置 3 模式功能实现 3.1 注入同步模式 3.2 支持独立注入的常规同步模式 3.2.1 中断的方式 3.2.2 DMA 读取常规数据 3.3 支持独立注入的交替模式 3.3.1 中断触发…

色彩的魔力:渐变色在设计中的无限可能性

夕阳&#xff0c;天空&#xff0c;湖面&#xff0c;夕阳...随着距离和光影的变化&#xff0c;颜色的渐变色&#xff0c;近大远小、近实远虚的透视&#xff0c;为大自然营造了浪漫的氛围。延伸到UI/UX设计领域&#xff0c;这种现实、惊艳、独特的渐变色也深受众多设计师的喜爱。…

setmapAVL树红黑树

目录 关联式容器树形结构的关联式容器setset的模板参数列表set的构造函数set的迭代器set的容量操作set其他操作 multisetmap键值对map的模板参数列表map的迭代器map中元素的修改map的容量与元素访问 multimap底层结构avl树avl树概念AVL树结点的定义AVL树的插入AVL树的旋转AVL树…

python-flask结合bootstrap实现网页小工具实例-半小时速通版

参考&#xff1a; Python之flask结合Bootstrap框架快速搭建Web应用_支持bootstrap的python软件-CSDN博客 https://blog.csdn.net/lovedingd/article/details/106696832 Bootstrap 警告框 | 菜鸟教程 https://www.runoob.com/bootstrap/bootstrap-alert-plugin.html flask框架…

数据结构——7.3 树形查找

7.3 树形查找 概念 二叉排序树&#xff08;BST&#xff09; 二叉排序树&#xff08;Binary Sort Tree&#xff0c;BST&#xff09;&#xff0c;又称为二叉查找&#xff08;搜索&#xff09;树&#xff08;Binary Search Tree&#xff09;&#xff0c;是一种特殊的二叉树&am…

力扣---从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]示…

使用Docker搭建Redis主从集群

文章目录 ☃️前言☃️搭建❄️❄️架构❄️❄️实例说明❄️❄️搭建第一个服务器上的两个实例❄️❄️搭建第二个服务器上的一个实例 ☃️开启主从❄️❄️改配置❄️❄️重启从节点 ☃️验证 ☃️前言 单节点 Redis 的并发能力是有上限的&#xff0c;要进一步提高Redis的并…

[大模型]TransNormerLLM-7B FastApi 部署调用

TransNormerLLM-7B FastApi 部署调用 1. TransNormer 介绍 TransNormerLLM 是一个基于线性注意力的 LLM&#xff0c;在准确性和效率方面均优于传统的基于 softmax 注意力的模型。它是在包含多达1.4 万亿个令牌的高质量语料库上进行训练的&#xff0c;TransNormerLLM 从之前的…

K-means和DBSCAN

目录 一、K-means和DBSCAN之间的主要区别 二、DBSCAN聚类算法 2.1DBSCAN聚类算法实现点集数据的聚类 2.2DBSCAN聚类算法实现鸢尾花数据集的聚类 三、K-means聚类算法 3.1K-means聚类算法实现随机数据的聚类 3.2K-means聚类算法实现鸢尾花数据集的聚类 一、K-means和DBSC…

014Node.js时间格式包silly-datetime安装与使用

下载&#xff1a; https://www.npmjs.com/网站上下载silly-datetime 安装 npm i silly-datetime --save var sd require(silly-datetime);console.log(new Date()); //2024-04-18T04:40:38.505Zvar dsd.format(new Date(), YYYY-MM-DD HH:mm);console.log(d); //2024…

idea在controller或者service使用ctrl+alt+b进入方法后,如何返回到 进入前的那一层

idea在controller或者service使用ctrlaltb进入方法后&#xff0c;如何返回到进入方法的最外层 解决方案使用 ctrlalt ← /→← /→ 键盘上的左右键盘

stm32中断发送接收数据

配置hal库 1配置时钟 2配置uart 3打开中断 程序结构 uart中断函数 中断接收和发送函数 HAL_UART_Receive_IT()&#xff1a;启动中断驱动的接收过程&#xff0c;当接收到指定数量的字节后会产生中断&#xff0c;并调用HAL_UART_RxCpltCallback()回调函数。 HAL_StatusTypeD…