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

news2024/10/6 0:30:22

       目录

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/812699.html

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

相关文章

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议&#xff0c;而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件&#xff08;英语&#xff1a;Internet Pr…

【前端知识】React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置

React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置 一、实现手动跳转路由 利用 useNavigate 封装一个 withRouter&#xff08;hoc/with_router.js&#xff09; import { useNavigate } from "react-router-dom"; // 封装一个高阶组件 function withRou…

iOS--runtime

什么是Runtime runtime是由C和C、汇编实现的一套API&#xff0c;为OC语言加入了面向对象、运行时的功能运行时&#xff08;runtime&#xff09;将数据类型的确定由编译时推迟到了运行时平时编写的OC代码&#xff0c;在程序运行过程中&#xff0c;最终会转换成runtime的C语言代…

操作系统5

设备管理 I/O设备 什么是?--- 将数据Input/Output(输入/输出)计算机的外部设备。 分类: 按使用特性:人机交互类外设、存储设备、网络通信设备; 按传输速度:低速、中速、高速设备; 按信息交换的单位:块设备、字符设备。 1. 块设备和字符设备的区别? 答:块设备…

C#文件操作从入门到精通(2)——查看某个dll中有哪些函数

kernel32.dll中含有ini文件操作使用的函数&#xff0c;我们可以通过VisualStudio自带的dumpbin.exe查看dll所包含的函数&#xff0c;操作步骤如下&#xff1a; 1、找到dumpbin.exe所在的文件夹 我的电脑中安装了VisualStudio2019社区版以及VisualStudio2017Professional&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现筛选框:支持下拉搜索+下拉多选+表字典(支持条件查询)功能

JeecgBoot(ant-design-vue)实现筛选框&#xff1a;支持下拉搜索下拉多选表字典(支持条件查询)功能 JSearchMultiSelectTag.vue源文件 一、需求介绍 在使用JeectBoot(ant-design-vue)设计表单时&#xff0c;需要实现下拉搜索下拉多选表字典(支持条件查询)。 但是系统目前有两…

【Java】零基础上手SpringBoot学习日记(day1)

前言 此帖为本人学习Springboot时的笔记&#xff0c;由于是个接触计算机一年左右的新手&#xff0c;也没有网站开发经验&#xff0c;所以有些地方的理解会比较浅显并且可能会出现错误&#xff0c;望大佬们多多包涵和指正。 Web应用开发 在我的理解中&#xff0c;Web应用的开发…

robot framework之第三方测试报告Allure

Allure 简单介绍 Allure是一个美化报告的工具。支持pytest, robot framework和junit等多种测试框架。 windows 安装allure 步骤1&#xff1a;gitlab 下载解压&#xff1a;https://github.com/allure-framework/allure2/releases 步骤2&#xff1a;进入bin目录, 点击allure.bat…

资深web前端开发工程师的工作职责表述(合集)

资深web前端开发工程师的工作职责表述1 职责 - 负责相关项目的web前端研发和优化工作 - 使用敏捷开发方法&#xff0c;完成产品或产品模块的设计和开发; - 按照编码规范编程&#xff0c;编制贯穿整个软件开发周期的文档资料; - 设计前端或后端架构&#xff0c;编写核心代码…

C语言字串函数、内存函数介绍以及模拟实现

目录 前言 本期内容介绍&#xff1a; 一、字符串函数 strlen介绍 strlen 模拟实现&#xff08;三种方式&#xff09; 方法一&#xff1a;计数器法 方法二&#xff1a;递归法&#xff08;不创建临时变量法&#xff09; 方法三&#xff1a;指针-指针 strcpy介绍 strcpy模…

国产单端口1000M以太网收发(PHY)芯片介绍

2023年将是国产以太网&#xff08;Ethernet&#xff09;传输芯片公司崛起之年&#xff0c;将涌现了一大批性能稳定&#xff0c;质量可靠的产品&#xff0c;国产网络传输芯片涵盖Ethernet PHY、Switch等中高端市场,如单&#xff08;或多&#xff09;端口千兆以太网PHY品牌&#…

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

msvcp100.dll丢失怎么修复,这三个常用的修复方法可以解决

msvcp100.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable软件包的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。msvcp100.dll是一个非常重要的文件&#xff0c;它为我们提供了许多关键的函数和类&#xff0c;使得我们能够更高效地…

算法通关村第一关——链表经典问题之删除链表元素专题笔记

删除特定节点 题目描述 给你一个链表的头节点head和一个整数val&#xff0c;请你删除链表汇总所有满足Node.val val 的节点&#xff0c;并返回新的头节点 示例 输入&#xff1a; head [1,2,6,3,4,5,6] , val 6 输出&#xff1a;[1,2,3,4,5] 分析 在删除节点cur时&#xff…

网络编程 IO多路复用 [select版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 select函数 功能&#xff1a;阻塞函数&#xff0c;让内核去监测集合中的文件描述符是否准备就绪&#xff0c;若准备就绪则解除阻塞。 原型&#xff1a; #include <sys/select.…

前端试用期工作总结范文5篇

前端试用期工作总结 &#xff08;篇1&#xff09; 时间飞逝&#xff0c;转眼间&#xff0c;做为一名Web前端开发的正式员工已经有两个月之久。在这个难忘而又夸姣的 日子里&#xff0c;我深入体会到了公司的积极氛围和各个部门的巨大魅力&#xff0c;目睹了公司一步步走向成熟…

计算机中存储器的层次结构

现代的存储器体系结构是这样的&#xff1a; 越往上访问速度越快&#xff0c;更小&#xff0c;成本也越高。越往下访问速度越慢&#xff0c;更大&#xff0c;成本也越低。 在最高层&#xff08;L0&#xff09;是少量快速的CPU寄存器&#xff0c;CPU可以在一个时钟周期内访问他…

八股总结(八)SSM框架体系

文章目录 Spring基础1、Spring、SpringMVC、Mybatis与SpringBoot的区别2、Spring中常用的注解及作用 Spring IoC 、 DI、Bean3、Spring IoC是什么&#xff0c;有什么好处&#xff0c;Spring中是怎么实现的&#xff1f;4、Bean相关5、Component 和 Bean 的区别是什么&#xff1f…

基于RASC的keil电子时钟制作(瑞萨RA)(5)----驱动LED数码管

基于RASC的keil电子时钟制作5_驱动LED数码管 概述硬件准备视频教程数码管说明配置IO口数码管显示库smg.csmg.h主程序 概述 本篇文章主要介绍如何使用e2studio对瑞萨RA2E1开发板进行数码管的驱动。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是芯片型号R7FA2E…

管理能力提升 -《六顶思考帽》读后感

我们都听过“盲人摸象”的故事&#xff0c;每个盲人讲的都是自己的真实体验&#xff0c;都认为自己一定没错&#xff0c;但彼此争吵的很厉害。 这是一种传统思辨思维&#xff0c;它有两个特征&#xff1a; 判断和争论 &#xff1a;坚持我对&#xff0c;你错&#xff0c;从自己的…