C++——继承(1)详解

       目录

1.继承的含义

2.继承的定义:

3.继承方式

例子1:基类的访问限定符为public,两个派生类的继承方式分别为public、protected时:

例子2: 基类的访问限定符为protected,两个派生类的继承方式分别为public、protected时:

继承方式解析:

总结:


        面向对象的三大特性为:封装、继承、多态。今天我们来学习第二大特性:继承!

例:

        当我们在做一个学校教务管理系统时,会有老师、学生、教务人员(非老师)三种对象,管理系统的任务需求主要是对这三类对象进行信息的填写,资料和完善。在代码方面,这三类对象因为所处的身份不同,各自的属性也就大不一样,但是也有一些相同的地方,例如:名字、性别、年龄、家庭住址、电话号等等。这三类对象都有这些相同的属性,意味着代码上会有冗余,降低了代码的可读性。之还只是一个小小的管理系统,若是在公司做那种大项目,需要成白上千个类,若是这些类都像上面这个管理系统一样,都有重复的代码。那么冗余的代码就不止几十行了。

 

 

        于是设计C++的大佬们为了解决这种问题,创造出了面向对象的新特性:继承。

1.继承的含义

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

 

       上图中下方创建出的这三个类通过特定的方式继承上面的Person类,这样一来,下面的这三个类就可以随意使用Person类中的成员属性,根本不需要再自己写这三个类都有的属性,这就好比父亲辛辛苦苦打下来的基业,他的儿子们可以轻松的获取到。

#include<iostream>
using namespace std;

//父类
class Person {
public:
		void Print() {
		cout << " name: " <<_name<< endl;
		cout << " address: " <<_address<< endl;
		cout << endl;
	}
public:
	int _id;
	 string _name="LiMing";
	int _age;
	 string _address="TaiYuan";

};


//子类1
class Student :public Person {
public:
	void crint() {
		 _name = "YuQing";
		cout << " name: " << _name << endl;
		cout << " address: " << _address << endl;
		cout <<"班级名称:" << _className << endl;
		cout << "所在年级:" << _grade << endl;
		cout << "年龄:" << _age << endl;
		cout << endl;
	}
private:
	string _className="2001班";
	int _grade=3;

};

//子类2:
class Teacher :protected Person {
public:
	void Print() {
		cout << " name: " << _name << endl;
		cout << " address: " << _address << endl;
		cout << "所教科目:" << _post << endl;
		cout << endl;

	}
public:
	string _post="语文";//职务

};


2.继承的定义:

       person类是父类,也可以称作是基类。Student是子类,也可以称作是派生类。一般的叫法是父类子类为组合,或者基类派生类为组合。

 

3.继承方式

 

继承的方式有三种:public(公有继承)、protected(保护继承)、private(私有继承) 

        这三个单词也作用于类的访问限定符,设置为public的成员,类内类外都可以进行访问;设置为protected、private形式的成员,只有类内可以访问,类外不允许访问,也就是说在学到继承的特性之前,protected和private的作用是一样的,没有区别。

        但是学习了继承之后,protected和private的区别就展现出来了。如下:

 

 如上图,表示的是父类的成员访问限定符是public、protected、private时,子类采用public、protected、private继承方式继承时,能否访问到的情况:

 

举两个例子:

例子1:基类的访问限定符为public,两个派生类的继承方式分别为public、protected时:

 

        在该例中,由于基类的成员都是公有的,派生类中可以随意地对继承过来的成员进行读写。而由于两个派生类的继承方式不同,类外在创建派生类的对象时,能够使用的成员权限却是不一样的!!! 

 

类外创建了两个类的对象:

 

 派生类1(公有继承的):

        派生类Student中并没有设置_age,_name等成员变量,但是在类外能够设置成员变量值,就是因为Student派生类公有继承了基类Person类的所有公共成员(包括函数和成员变量),基于此,Student类对象便可以随意访问Person类的公共成员,并为其设置值,增强了代码的复用性。

        类外通过公有继承的派生类对象访问任何基类成员都是成功的 

 

派生类2(保护继承的):

 

        因为Teacher子类是保护继承了父类Person类,在Teacher类中可以访问Person类的公有保护成员,但在类外却不能被访问,所以上面的前两行代码报错了。

         类外通过保护继承的派生类对象访问任何基类成员都是失败的 

注:当派生类是私有继承基类时,派生类内仍然可以随意读写从基类继承过来的成员,但是类外就不能使用派生类的任何成员。 


例子2: 基类的访问限定符为protected,两个派生类的继承方式分别为public、protected时:

 

        当基类的访问限定符是protected时,两个派生类分别公有继承和保护继承基类,这两个派生类仍然可以随意读写访问基类成员。

 在类外:

类外通过公有继承的派生类对象访问任何基类成员都是报错的。

 

 类外通过保护继承的派生类对象访问任何基类成员都是报错的。


继承方式解析:

        1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它

        2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。这就是protected和private两个关键字的最大区别!


        3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在派生类中都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),所以权限上:public > protected> private。

        4. 使用关键字class创建出的类,如果不写继承方式时,默认的继承方式是private,使用struct关键字创建出的类,如果不写继承方式时,默认的继承方式是public,不过最好显示的写出继承方式,可以增强代码可读性。

        5. 在实际运用中派生类一般都是使用public继承方式几乎很少使用protetced / private继承,并且我们也不提倡使用protetced / private继承,因为protetced / private继承下来的成员都只能在派生类的类里面使用,类外(主函数执行流中)是没有办法使用子类的成员的,实际中扩展维护性不强。

 

总结:

        1.基类的访问限定符限制了派生类能否访问读写基类的成员;

        2.而派生类的继承方式限制了类外能否访问读写派生类的成员!

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

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

相关文章

机器学习深度学习——Dropout

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——权重衰减 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 Drop…

百度与AI:历史、投资和监管

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 百度的人工智能在中国具有先发优势 随着ChatGPT的爆火&#xff0c;人工智能重新引起了投资者的注意&#xff0c;然而人工智能并不是突然爆火的&#xff0c;而是全球众多公司在人工智能技术上进行数十年如一日的研发和积累&a…

MYSQL 分库分表

公司现有业务不断发展&#xff0c;流量剧增&#xff0c;交易数量突破了千万订单&#xff0c;但是订单数据还是单表存储&#xff0c;主从分离后&#xff0c;虽然减少了缓解读请求的压力&#xff0c;但随着写入压力增加&#xff0c;数据库的查询和写入性能都在下降&#xff0c;这…

Kubernetes ConfigMap - Secret - 使用ConfigMap来配置 Redis

目录 ConfigMap &#xff1a; 参考文档&#xff1a;k8s -- ConfigMap - 简书 (jianshu.com) K8S ConfigMap使用 - 知乎 (zhihu.com) ConfigMap的作用类型&#xff1a; 可以作为卷的数据来源&#xff1a;使用 ConfigMap 来配置 Redis | Kubernetes 可以基于文件创建 Conf…

服务器介绍

本文章转载与b战up主谈三国圈&#xff0c;仅用于学习讨论&#xff0c;如有侵权&#xff0c;请联系博主 机架型服务器 堆出同时服务百万人次机组 刀型服务器 服务器炸了 比如用户访问量暴增 超过机组的峰值处理能力&#xff0c;进而导致卡顿或炸服&#xff0c; 适合企业的塔式…

idea下tomcat运行乱码问题解决方法

idea虚拟机选项添加-Dfile.encodingUTF-8

jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比

一、数据结构差别 1.7&#xff1a;数组链表 1.8&#xff1a;数组链表红黑树 当链表的长度大于8时&#xff0c;数组长度大于64&#xff0c;原来的链表数据结构变为红黑树 二、HashMap中的关键属性和方法区别 方法/变量/类 JDK7 JDK8 备注 DEFAULT_INITIAL_CAPACITY 16 16…

一个类似Office用户界面的WPF库

博主介绍&#xff1a; &#x1f308;一个10年开发经验.Net老程序员&#xff0c;微软MVP、博客专家、CSDN/阿里云 .Net领域优质创作者&#xff0c;专注于.Net领域知识、开源项目分享&#xff01;&#x1f308; &#x1f6d5;文末获取&#xff0c;加入交流群&#x1f6d5; &#…

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

时序预测 | MATLAB实现NARX-ANFIS时间序列预测

时序预测 | MATLAB实现NARX-ANFIS时间序列预测 目录 时序预测 | MATLAB实现NARX-ANFIS时间序列预测效果一览基本介绍研究内容程序设计参考资料效果一览

基于Open3D的点云处理13-分割

平面分割&#xff08;基于RANSAC&#xff09; 使用RANSAC算法从点云中拟合平面&#xff1b; 接口&#xff1a;segment_plane 测试&#xff1a;Plane-segmentation import open3d as o3dpcd_point_cloud o3d.data.PCDPointCloud() pcd o3d.io.read_point_cloud(pcd_point_cl…

安防监控视频汇聚EasyCVR修改录像计划等待时间较长,是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…

基于传统检测算法hog+svm实现图像多分类

直接上效果图&#xff1a; 代码仓库和视频演示b站视频005期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在datasets文件夹下 运行01train.py即可训练 训练结束后会保存模型在本地 运行02pyqt.py会有一个可视化…

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

Github Copilot在JetBrains软件中登录Github失败的解决方案

背景 我在成功通过了Github Copilot的学生认证之后&#xff0c;在VS Code和PyCharm中安装了Github Copilot插件&#xff0c;但在PyCharm中插件出现了问题&#xff0c;在登录Github时会一直Retrieving Github Device Code&#xff0c;最终登录失败。 我尝试了网上修改DNS&…

ARM裸机-8

1、ARM的编程模式和工作模式 1.1、ARM的基本设定 ARM采用的是32位架构 ARM约定&#xff1a; - Byte&#xff1a;8 bits - Halfword &#xff1a;16 bits (2 byte) - Word&#xff1a;32 bits (4 byte) 大部分ARM core 提供&#xff1a; - ARM 指令集 (32-bit) - Thumb 指令集 …

微信小程序中使用echarts方法

小程序中使用echarts echarts是一个基于JS的数据可视化图标库&#xff0c;它提供了直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性定制的数据可视化图表。一般在vue中会使用到&#xff0c;并且官网也详细的说明了如何在vue中使用&#xff0c;但是今天我想来探讨的…

【解析excel】利用easyexcel解析excel

【解析excel】利用easyexcel解析excel POM监听类工具类测试类部分测试结果备注其他 EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&…

iOS开发-自定义TabbarController与Tabbar按钮Badge角标

iOS开发-自定义Tabbar按钮Badge角标 Tabbar是放在APP底部的控件。UITabbarController是一个非常常见的一种展示模式了。比如微信、QQ都是使用tabbar来进行功能分类的管理。 一、实现自定义Tabbar 我这里Tabbar继承于系统的UITabBar&#xff0c;定义背景图、线条的颜色、tab…