C++继承特性(1)——含义与继承方式的讲解

news2024/11/16 23:54:05

       目录

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.而派生类的继承方式限制了类外能否访问读写派生类的成员!

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

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

相关文章

软件测试工程师的职业规划,你都做好了吗?

第一阶段&#xff1a;初级测试工程师 一般刚刚入门&#xff0c;熟悉基本的测试流程&#xff0c;此时已打基础为主。入门薪资一般在6000-8000元之间。 具体工作是&#xff1a; &#xff08;1&#xff09; 按照测试方案和流程对产品进行功能测试&#xff0c;检查产品是否有缺陷…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

【构造】CF1758 C

Problem - 1758C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e510; const int mxe2e510;int N,x; int ans[mxn];void solve(){cin>>N>>x;if(N%x!0)…

1999-2021年30省平均受教育年限(含原始数据和具体计算过程)

1999-2021年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2021年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…

2023年7月第4周大模型荟萃

2023年7月第4周大模型荟萃 2023.7.31版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、Cerebras推出全球最强AI超算 AI芯片初创公司Cerebras Systems和总部位于阿联酋的技术控股集团G42于7月20日宣布&#xff0c;携手打造一个由互联的超…

pytorch学习——正则化技术——权重衰减

一、概念介绍 权重衰减&#xff08;Weight Decay&#xff09;是一种常用的正则化技术&#xff0c;它通过在损失函数中添加一个惩罚项来限制模型的复杂度&#xff0c;从而防止过拟合。 在训练参数化机器学习模型时&#xff0c; 权重衰减&#xff08;weight decay&#xff09;是…

【JavaEE初阶】Servlet(四) Cookie Session

文章目录 1. Cookie && Session1.1 Cookie && Session1.2 Servlet会话管理操作 1. Cookie && Session 1.1 Cookie && Session Cookie是什么? Cookie是浏览器提供的持久化存储数据的机制.Cookie从哪里来? Cookie从服务器返回给浏览器. 服务…

生产中出现CPU或者内存飙升如何进行解决

文章目录 定位CPU标高内存问题JVM参数工具 定位CPU标高 方法1&#xff1a; 1-启动&#xff1a;java -jar 2_cpu-0.0.1-SNAPSHOT.jar 8 > log.file 2>&1 & 2-一般来说&#xff0c;应用服务器通常只部署了java应用&#xff0c;可以top一下先确认&#xff0c;是否是…

Java 错误异常介绍(Exceptions)

1、异常介绍 异常是程序执行期间发生的意外事件。它影响程序指令流&#xff0c;从而导致程序异常终止。 发生异常的原因有很多。其中包括&#xff1a; 无效的用户输入 设备故障 网络连接丢失 物理限制&#xff08;磁盘内存不足&#xff09; 代码错误 打开一个不可用的文…

第四章:C语言的条件分支控制结构

文章目录 1、分支控制if..else...2、分支控制if..else if...else...(嵌套)3、Switch4、goto 1、分支控制if…else… 标准格式&#xff1a;if{}else{} {}里面的语句表示条件是否成立再决定是否执行 2、分支控制if…else if…else…(嵌套) 标准格式&#xff1a;if{}else if{}…

无人机调试笔记——常见参数

无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID&#xff0c;也就是无人机的速度闭环控制&#xff0c;确认没有问题后再进行外环位置控制&#xff0c;也就是定点模式控制。 2、调试的时…

CentOS7.3 安装 docker

亲测、截图 阿里云服务器 文章目录 更新源2345 启动开机自启 更新源 sudo yum update -y2 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 sudo yum …

一款介于无代码和低代码之间的数据可视化平台

一、前言 随着企业数字化拉开序幕&#xff0c;低代码( Low Code Development)开发的概念开始火起来&#xff0c;即用少量的代码就能开发复杂的业务系统。然后更进一步&#xff0c;由此又催生出一个新的概念&#xff1a;无代码开发( No Code Development)。 低代码和无代码开发平…

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…

自然语言处理学习笔记(一)————概论

目录 1.自然语言处理概念 2.自然语言与编程语言的比较 &#xff08;1&#xff09;词汇量&#xff1a; &#xff08;2&#xff09;结构化&#xff1a; &#xff08;3&#xff09;歧义性&#xff1a; &#xff08;4&#xff09;容错性&#xff1a; &#xff08;5&#xff0…

【143. 重排链表】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不…

Redis (一)消息订阅和发送测试

〇、redis 配置 1、概况 本文基于 Ubuntu20.04 云服务器配置Redis&#xff0c;且在本地进行 Redis 测试。 2、目录概况 一、配置文件 位于 /config/app.yml 中&#xff0c;目的用于 Redis 初始化&#xff1a; redis:addr: "39.104.**.28:6379"password: "p…