C++中的继承(上)

news2024/9/23 13:23:05

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、继承概述
  • 二、继承方式与访问限定符
  • 三、继承中的作用域
  • 四、基类和派生类对象赋值兼容转换
  • 五、继承当中默认成员函数的问题
    • 1.构造函数
    • 2.拷贝构造和赋值运算符重载
    • 3.析构函数
  • 六、继承与友元
  • 七、继承与和静态

一、继承概述

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

在这里插入图片描述
函数间相似可以提取出来写成函数库,比如algorithm算法库
那么类之间的相似,就要体现到继承

class Person
{
public:
	void Print()
	{
		cout<<"name:"<<_name<<endl;
		cout<<"age:"<<_age<<endl;
	}
protected:
	string _name ="peter";
	int _age =18;
};

class Student : public Person
{
protected:
	int _stuid;//学号
};

这就是一个简单的继承
这个公共的类Person就叫做基类/父类
这个继承的类Student就叫做派生类/子类

二、继承方式与访问限定符

在这里插入图片描述
访问限定符*继承方式 = 9 种
在这里插入图片描述
C++的继承设计过分复杂,99%都是使用的共有继承
其实就是在基类当中的private成员继承之后不可见之外,其他的按最低权限来更改访问限定符即可,另外,不可见的意思是我是复制了的,但是语法上规定我不能去访问(又被称作隐身)

因为基类的private是不可见的,所以如果你想在基类中不想被类外访问,但是需要在派生类中能访问到(不隐式),那么原来的那个成员就只能是protected,可以看出保护成员限定符是因为继承才出现的

三、继承中的作用域

class Person
{
protected:
	string _name = "小李子";//声明+ 缺省参数peter
	int _num = 111;
};

class Student:public Person
{
public :
	void Print()
	{
		cout << "姓名:" << _name << endl;//小李子
		cout << "学号:" << _num << endl;//999
//          cout<<"号码"<<Person::_num<<endl;//111
	}
protected:
	int _num=999;//学号
};

void main()
{
	Student s1;
	s1.Print();
}

1.在继承体系当中,基类和子类有独立的作用域
2.子类和父类具有同名成员,子类对象将屏蔽对父类同名成员的直接访问,这种情况被称为隐藏,也叫重定义(只能显示的去访问父类成员)
3.值得注意的是,在隐藏/重定义中,只要成员函数名相同,就构成隐藏,因为在不同的作用域,所以不构成函数重载

class A
{
public :
	void fun()
	{
		cout << "func()" << endl;
	}
};

class B : public A
{
public:
	void fun(int i)
	{
		cout << "func(int i)->" << i << endl;
	}
};
1.两个函数是不构成函数重载的,因为在不同的作用域
2.两个函数构成隐藏。
int main()
{
    B b;
    b.fun(10);
    //b.fun();//无法这样调用,编译报错,因为已经构成隐藏,需要显示访问父类
    b.A::fun();
}

四、基类和派生类对象赋值兼容转换

1.派生类对象可以赋值给基类对象/基类的指针/基类的引用有个形象的说法叫做切片或者切割,寓意就是把派生类中父类的那部分切来赋值给基类的xx

class Person
{
protected:
	string _name;
	string _sex;
	int _age;
};
class Student:public Person
{
public:
	int _No;//学号
};

int main()
{
	Student sobj;
	Person pobj=sobj;//赋值兼容转换
	Person *pp = &sobj;
	Person& rp= sobj;
}

这是继承天然支持的,称作切割或者切片(赋值兼容转换)
特殊的原因就是他们是继承关系
在这里插入图片描述
而且, Person*pp = &sobj,其实pp还是指向的子类对象,只不过它只能看到子类当中父类的那一部分,引用也是一样的道理,引用只是变成了子类对象父类那一部分的别名。这不是隐式类型转换,所以也不会有具有常性的临时变量

基类的指针或者引用可以通过强转的方式赋值给派生类的指针或者引用,但是基类指针只有指向派生类对象才是安全的。

五、继承当中默认成员函数的问题

对下面的小总结:要不是C++规定,继承的东西要通过父类的成员函数来进行操作的话,理论上来说,子类是可以直接操作的,因为已经拷贝给我了,就是我的

1.构造函数

如下代码所示:
继承的父类的成员,必须调用父类的构造函数初始化
子类只初始化自己的,父类的通过调用它的构造函数进行初始化

class Person
{
public:
	Person(const char*name = "peter")
protected:
	string _name;
};
class Student:public Person
{
public:
	Student(const char*name,int num)
		//:_name(name)报错
		:Person(name)
		,_num(num)
	{}
protected:
	int _num;//学号
};

2.拷贝构造和赋值运算符重载

和构造函数一样,父类的成员只能通过调用父类的拷贝构造/赋值运算符重载进行处理

3.析构函数

析构函数是这些默认构造函数中最特殊的一个
子类的析构函数和父类的析构函数是构成隐藏的/重定义,是因为由于后面多态的需要,析构函数的名字会被同一处理成destructor(),也就是说,写的是~Person ~Student,编译器看到的是destructor()

//错误代码
~Student()
{
	~Person();
}

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

为什么Person析构的次数翻倍了????
---->
其实不去显示的调用父类的析构才是正确的
1.为了保证先定义的先析构,后定义的后析构,那么父类的成员是先构造的,显示的去调用析构是无法保证父类的成员先析构的,所以编译器会自动调用父类的析构,所以我们不用显示调用
2.这里的多次析构没出问题的原因是析构中说明都没干,如果说我在里面delete两次资源,则会崩溃


继承从整体来看,父类的成员就应该调用父类的函数来处理

六、继承与友元

友元关系是不能够继承的,也就是说,基类友元不能访问子类私有和保护成员,像访问的话就也要搞成子类的友元,友元会破坏封装,尽量少用,避不开的话还是得用

七、继承与和静态

==在继承中,整个继承体系得static静态成员是同一个,无论派生出了多少个子类。==所以静态成员变量可以用来计数整个继承体系到底创建了多少个实例对象。

在这里插入图片描述

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

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

相关文章

我做整车疲劳耐久分析9年积累的22条建模经验

作者&#xff1a;孙老师 对于承受交变应力的设备&#xff0c;疲劳分析在有限元分析占有重要地位。在进行疲劳分析时&#xff0c;有限元模型的正确搭建又至关重要。我们都知道&#xff0c;模型的质量直接影响分析的精度&#xff0c;所以好的建模方式是疲劳分析的第一步&#xf…

OpenGL原理与实践——核心模式(一):VBO、VAO等原理解析及项目初始设置

目录 序言——OpenGL在是什么&#xff1f;为什么&#xff1f;做什么? OpenGL实现了什么 OpenGL内模型数据的本质——顶点数据 我们需要研究什么——三角形&#xff0c;一个图形基元 MVP变换 OpenGL渲染流程的关键——摄像机变换 OpenGL渲染管线概览 准备——项目配置…

dpdk结合sriov测试vpp ipsec性能

目的 测试vpp ipsec转发性能&#xff0c;想当作openstack VPNaas的一种driver&#xff0c;提高ipsec网关的转发能力。 环境 测试资源很有限&#xff0c;没有测试仪&#xff0c;物理机之外的交换机不受控制。 只有两台物理机&#xff0c;各有一张测试网卡&#xff0c;网卡有…

分布式存储之 etcd 的集群管理

在分布式文件存储中&#xff0c;我们通常会面临集群选主&#xff0c;配置共享和节点状态监控的问题。通过 etcd&#xff08;基于 Raft 协议)&#xff09;可以实现超大规模集群的管理&#xff0c;以及多节点的服务可靠性。今天&#xff0c;我们就聊聊 etcd 在分布式存储中的具体…

作业-11.24

1、多线程并发服务器 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <string.h> #include <pthread.h> #include <stdlib.h> #include <…

MCE | 间歇性禁食增强抗癌疗效

越来越多的研究表明&#xff0c;“禁食”不仅与免疫系统调控 、血糖调节有关&#xff0c;还对多种疾病的治疗有改善效果&#xff0c;如心血管疾病和癌症等。这里的“禁食”与节食不同&#xff0c;一般指的是间歇性禁食&#xff0c;包括多种方案&#xff0c;例如 FMD (Fasting-m…

LeetCode135. 分发糖果(贪心算法)

1 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

pyinstaller打包教程(pycharm)

PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具&#xff0c;支持 Windows/Linux/MacOS三大主流平台&#xff0c;能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件&#xff0c;从而允许最终用户在无需安装 Python 的情况下执行应用程序。 PyInstalle…

IOS安全测试学习-DVIA-v2

前言 为学习IOS知识并加深理解&#xff0c;故通过IOS漏洞靶场来直接体现IOS环境中的常见漏洞。 环境准备 iPhone X ios 13.4.1 已越狱 MacOS Big Sur 11.0 Bate 虚拟机 DVIA-v2 IOS 漏洞靶场app grapefruit、objection #pip3 install frida、pip3 install frida-tools、sudo …

【App自动化测试】(五)移动端自动化常用的元素定位工具——Uiautomatorviewer、 ATX WEditor、Appium Inspector

目录1. uiautomatorviewer1.1 uiautomatorviewer 的安装1.2 uiautomatorviewer 工具功能介绍1.3 uiautomatorviewer 的使用方法2. ATX WEditor2.1 ATX WEditor的安装2.2 ATX WEditor 功能介绍2.3 ATX WEditor 的使用3. Appium Inspector3.1 Appium Inspector安装与运行3.2 Appi…

【AWS系列】第八讲:AWS Serverless之S3

目录 序言 1.基础介绍 1.1 概念介绍 1.2 原理介绍 1.3 应用场景 1.3.1 构建数据湖 1.3.2 备份和还原关键数据 1.3.3 以最低成本存档数据 1.3.4 运行云原生应用程序 1.4 S3 的功能 1.4.1 存储类 1.4.2 存储管理 1.4.3 访问管理 2 使用方法 2.1 创建存储桶 ​2.2…

用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

day074:XML、XML的解析

目录 一、XML 1.什么是XML 2.XML作用 3.XML语法规则 4.XML文件代码示例 二、解析XML文件 1.解析XML 2.常用的解析思想 &#xff08;1&#xff09;DOM思想 &#xff08;2&#xff09;图解 3.XML解析工具 一、XML 1.什么是XML XML&#xff08;EXtensible Markup Lan…

【已解决】CentOS7等linux系统时区时间不对显示误差8小时

文章目录问题解决处理时区问题date查看时间、时区timedatectl查看时间、时区查看localtime设置时区处理时间问题问题 中国使用的是东八区上海时间&#xff0c;而linux服务器&#xff0c;一般默认是0时区UTC&#xff0c;所以需要将时区改为东八区CST将时区改为东八区后&#xf…

机器学习-决策树算法

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录1. 决策树算法1.1. 什么是决策树/判定树1.2. 决策树归纳算法1.3. 熵概念1.4. 具体算法1.5. 决策树剪枝1.6. 连续值与缺失值处理1.6…

MCE | 正确认识阿尔茨海默病

什么是阿尔茨海默病 (Alzheimer Disease, AD)&#xff1f; 1907 年德国神经病理学家阿尔茨海默 (Alois Alzheimer) 仔细描述了一名具有进行性痴呆表现的 51 岁妇女 (Auguste Deter) 的症状&#xff1a; “她的记忆力严重受损。如果向她显示了对象&#xff0c;她会正确地命名它…

还在调API写所谓的AI“女友”,唠了唠了,教你基于python咱们“new”一个(深度学习)

文章目录前言停用词闲聊语料基础知识词的表示表达one-hot编码词嵌入大致原理实现简单版复杂版如何训练转换后的形状RNN循环网络RNNRNN投影图RNN是三维立体的LSTM&GRU构建数据配置数据集准备分词划分数据集加载模型搭建基本概念Encoder搭建DecoderAttention机制decoder与bea…

赫夫曼树赫夫曼编码的创建

目录基础知识点最优二叉树如何构造赫夫曼树赫夫曼编码编码与压缩文件代码结构体设计创建赫夫曼树创建构建赫夫曼编码基础知识点 赫夫曼树又称为最优树&#xff0c;是一种带权路径长短最短的树&#xff0c;有着广泛的应用。 最优二叉树 我们给出路径和路径长度的概念。从树的…

盘点面试常见的设计类算法问题

设计问题也是一种很重要的考察类型&#xff0c;特征是整体难度不大&#xff0c;但是要求结构合理、复用性好、考虑周全&#xff0c;代码规范等等。有些面试官不喜欢烧脑的动态规划等问题&#xff0c;就喜欢设计题&#xff0c;笔者曾经在面试微博和猿辅导都遇到过类似的问题。这…

【操作系统】2.1 进程与线程总结

2.1.1 操作系统之进程的定义、特征、组成、组织 2.1.1 操作系统之进程的定义、特征、组成、组织_StudyWinter的博客-CSDN博客 进程由程序段、数据段、进程控制块&#xff08;PCB&#xff09;三部分组成。 进程是进程实体的运行过程&#xff0c;是系统进行资源分配和资源调度的…