C++——继承、权限对继承的影响
目录
继承基本概念
编程示例
1.基类(父类)Person
代码特点说明
权限对类的影响
编辑
编程示例
1. 公有继承 (public inheritance)
2. 保护继承 (protected inheritance)
3. 私有继承 (private inheritance)
重要规则
实际应用
继承基本概念
继承是面向对象编程(OOP)中的一个核心概念,特别是在C++中。它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。继承的主要目的是实现代码重用,以及建立一种类型之间的层次关系。
特点
1. 代码重用:子类继承了父类的属性和方法,减少了代码的重复编写。
2. 扩展性:子类可以扩展父类的功能,添加新的属性和方法,或者重写(覆盖)现有的方法(属性不能被重写或覆盖)。
3. 多态性:通过继承和虚函数,C++支持多态,允许在运行时决定调用哪个函数。
编程示例
C++中类的继承机制,定义了一个基类(Person)和两个派生类(Student和Teacher)。
基类(父类)Person
以下使用一个编程案例体验一下继承,如有一个 Person(表示人的基本信息)类,包含两个成员变量:name 和 age。创建两个 Student 和 Teacher 类,分别表示学生和老师。众所周知,不管是老师还是学生都是人,都有名字和年龄。如果给这两个类都声明成员变量: name 和 age ,就会显得繁琐,这里就可以使用继承,将 Person 作为父类,Student 和 Teacher 作为子类并且用公有权限继承 Person(父类),使 Student 和 Teacher 可以使用 Person 类里的成员变量,减少代码的重复编写。
#include <iostream>
#include <string>using namespace std; // 使用标准命名空间// 基类(父类)Person - 表示人的基本信息
class Person
{
public: // 公有访问权限string name; // 姓名属性int age; // 年龄属性
};// 派生类(子类)Student - 继承自Person类,表示学生
class Student : public Person // 公有继承方式
{
public:string occupation; // 学生特有的职业属性// 打印学生信息的方法void printfStudentMsg(){// 可以访问从Person继承的name和age,以及自身的occupationcout << "职业:" << occupation << ",姓名:" << name << ",年龄:" << age << endl;}
};// 派生类(子类)Teacher - 继承自Person类,表示教师
class Teacher : public Person // 公有继承方式
{
public:string occupation; // 教师特有的职业属性// 打印教师信息的方法void printfTeacherMsg(){// 可以访问从Person继承的name和age,以及自身的occupationcout << "职业:" << occupation << ",姓名:" << name << ",年龄:" << age << endl;}
};int main()
{// 创建Student对象Student stu;// 设置学生属性stu.name = "李白"; // 设置继承自Person的name属性stu.age = 18; // 设置继承自Person的age属性stu.occupation = "学生"; // 设置Student特有的occupation属性stu.printfStudentMsg(); // 调用Student的打印方法// 创建Teacher对象Teacher t;// 设置教师属性(修正了原始代码中的错误赋值)t.name = "张三"; // 设置继承自Person的name属性t.occupation = "教师"; // 设置Teacher特有的occupation属性t.age = 26; // 设置继承自Person的age属性t.printfTeacherMsg(); // 调用Teacher的打印方法return 0;
}
代码特点说明
-
继承关系:
-
Person是基类,包含人的基本属性(name和age) -
Student和Teacher是派生类,通过公有继承(public Person)获得Person的所有public成员
-
-
派生类特点:
-
继承了基类的所有public成员(name和age)
-
添加了自己的特有成员(occupation)
-
定义了自己的成员函数(printfStudentMsg和printfTeacherMsg)
-
-
公有继承(public inheritance)特点:
-
基类的public成员在派生类中仍然是public
-
基类的protected成员在派生类中仍然是protected
-
基类的private成员在派生类中不可直接访问
-
权限对类的影响
在C++中,访问控制符对继承的影响可以通过下表来清晰地展示。这个表格展示了不同类型的继承( public 、 protected 、 private )如何影响基类的不同类型成员( public 、 protected 、private )在派生类中的访问级别。

解释:
public 继承:基类的 public 成员在派生类中仍然是 public 的, protected 成员仍然是 protected 的。基类的 private 成员在派生类中不可访问。
protected 继承:基类的 public 和 protected 成员在派生类中都变成 protected 的。基类的 private 成员在派生类中不可访问。
private 继承:基类的 public 和 protected 成员在派生类中都变成 private 的。基类的 private 成员在派生类中不可访问。
这个表格提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。记住,无论继承类型如何,基类的 private 成员始终不可直接在派生类中访问。
访问权限回顾
编程示例
#include <iostream>
using namespace std;
//基类,父类
class Vehicle{ //交通工具,车,抽象的概念
public:string type;string contry;string color;double price;int numOfWheel;
protected:int protectedData;
private:int privateData;
public:void run(){cout << "车跑起来了" << endl;}void stop();
};
//私有继承测试
class TestClass : private Vehicle{
public:void tsetFunc(){price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用}
};
//公有继承测试
class Truck : protected Vehicle{
public:void testFunc(){type = "数据测试"; //保持私有权限protectedData = 10; //保持私有权限privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。}
};
//公有继承,基类的公有权限和保护权限不变,私有成员不能访问
class Bickle : public Vehicle{
public:void testFunc(){protectedData = 10;}
};
//派生类,子类
class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
public:int stateOfTop;void openTopped();void pdrifting();
};
int main()
{TestClass test;test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限Truck t;t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限Roadster ftype;ftype.type = "捷豹Ftype";ftype.run();Bickle bike;bike.type = "死飞";bike.run();return 0;
}
1. 公有继承 (public inheritance)
class Roadster : public Vehicle
class Bickle : public Vehicle
特点:
-
基类的public成员在派生类中保持public
-
基类的protected成员在派生类中保持protected
-
基类的private成员在派生类中不可访问
例子中Bickle类的testFunc()可以访问基类的protected成员protectedData。
2. 保护继承 (protected inheritance)
class Truck : protected Vehicle
特点:
-
基类的public和protected成员在派生类中都变为protected
-
基类的private成员在派生类中不可访问
所以在Truck类外部:
Truck t;
t.type = "测试"; // 错误,type现在是protected
t.protectedData = 10; // 错误,protected成员不能在类外访问
3. 私有继承 (private inheritance)
class TestClass : private Vehicle
特点:
-
基类的public和protected成员在派生类中都变为private
-
基类的private成员在派生类中不可访问
所以在TestClass类外部:
TestClass test;
test.price = 3.3; // 错误,price现在是private
重要规则
-
无论哪种继承方式,基类的private成员在派生类中都不可直接访问
-
继承方式决定了基类成员在派生类中的访问权限:
-
公有继承:保持原权限
-
保护继承:public→protected
-
私有继承:public/protected→private
-
实际应用
-
公有继承是最常用的,表示"是一个"的关系
-
保护继承和私有继承较少使用,通常用于实现细节的隐藏
-
在派生类内部,可以访问基类的public和protected成员(取决于继承方式)
虚函数
相关文章:
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...
js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法
1、基本说明 在JavaScript中,剩余运算符(Rest Operator)和展开运算符(Spread Operator)虽然在某些方面有相似之处,但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别: 1.1. 剩余…...
雅思练习总结(二十六)
雅思练习总结(二十六) 本文章是雅思练习总结(二十六),总结了文章《MAKING EVERYDROP COUNT》,内容包括原文精翻,文章脉络总结,单词扩展学习3个部分 1 文章原文及翻译 MAKING EVERYDROP COUNT 翻译:让每一滴水,都充满价值 A The history of human civilisation i…...
华为手机清理大数据的方法
清理手机最大的问题是,手动和自动清理了多次,花费了很长时间,但是只腾挪出来了一点点空间,还是有很大空间无法使用,这篇文章就告诉你怎样做,以花瓣剪辑为例,如下: 删除数据ÿ…...
单元测试原则之——不要过度模拟
什么是过度模拟? 过度模拟(over-mocking)是指在单元测试中,模拟了太多依赖项,甚至模拟了本不需要模拟的简单对象或行为。过度模拟会导致: 测试代码变得复杂,难以阅读和维护。测试逻辑偏离了实际业务逻辑,无法验证真实代码的行为。忽略了被测单元与依赖项之间的真实交互…...
操作系统基础:07 我们的任务
课程回顾与后续规划 上节课我们探讨了操作系统的历史。了解历史能让我们明智,从操作系统的发展历程中,我们总结出两个核心的里程碑式图像:多进程(多任务切换)图像和文件操作图像 。Unix和Windows等系统的成功…...
微服务的服务调用详解以及常见解决方案对比
微服务服务调用详解 1. 服务调用分类 服务调用根据通信方式、同步性、实现模式可分为以下类型: 按通信协议分类 类型典型协议/框架特点RPC(远程过程调用)Dubbo、gRPC、Apache Thrift高性能、二进制协议、强类型定义HTTP/RESTSpring RestTe…...
Verilog:LED呼吸灯
模块接口说明 信号方向描述clk输入系统时钟(100MHz,周期10ns)rst_n输入低电平有效的异步复位信号led_en输入总使能信号(1开启呼吸灯,0关闭)speed_en输入呼吸速度调节使能信号speed[2:0]输入呼吸速度分级&a…...
一个很好用的vue2在线签名组件
在前端开发的日常工作中,我们常常会遇到需要用户进行在线签名的需求,比如电子合同签署、表单确认等场景。最近,我在项目里使用了一款极为好用的 Vue2 在线签名组件,今天就来和大家分享一下使用心得。 效果图 上代码 在 views 下…...
C语言实现TcpDump
一、 在 C 语言中实现 TCP 抓包功能,通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库,它提供了捕获网络数据包的接口。 libpcap 是一个广泛使用的 C 语言库,用于捕获和过滤网络数据包。它提供了一个通用接口,用于访…...
吴恩达深度学习复盘(14)迁移学习|项目基本周期
迁移学习 迁移学习是一种机器学习技术,它允许我们将从一个任务中学习到的知识应用到另一个相关的任务中。其核心思想在于,很多情况下,从头开始训练一个模型需要大量的数据和计算资源,而迁移学习能够复用在已有数据上训练好的模型…...
【STM32】STemWin库,使用template API
目录 CubeMX配置 工程文件配置 Keil配置 STemwin配置 GUIConf.c LCDConf.c 打点函数 修改屏幕分辨率 GUI_X.c 主函数 添加区域填充函数 移植过程中需要一些参考手册,如下 STemwin使用指南 emWin User Guide & Reference Manual CubeMX配置 参考驱…...
Matlab Add Legend To Graph-图例添加到图
Add Legeng To Graph: Matlab的legend()函数-图例添加到图 将图例添加到图 ,图例是标记绘制在图上的数据序列的有用方法。 下列示例说明如何创建图例并进行一些常见修改,例如更改位置、设置字体大小以及添加标题。您还可以创建具有多列的图…...
AI基础04-日志数据采集
上篇文章我们学习了视频的数据采集,今天主要了解一下日志数据采集的方法。日志数据采集的目的通常是:调试、运维监控和业务分析。调试主要是工程师在程序异常时针对关键环节把相关参数通过日志打印出来,找出哪个环节出现了问题。运维监控主要…...
文章记单词 | 第29篇(六级)
一,单词释义 AI /ˌeɪ ˈaɪ/ abbr. 人工智能(Artificial Intelligence)inventory /ˈɪnvəntri/ n. 存货清单;财产清单;库存货物;存货;v. 编制目录;开列清单;盘存cha…...
Arduino示例代码讲解:String substring() 字符串子链
Arduino示例代码讲解:String substring 字符串子链 String substring() 字符串子链程序功能概述功能:硬件要求:输出:代码结构`setup()` 函数`loop()` 函数创建字符串:提取子字符串:无限循环:运行过程代码输出解释原始字符串:提取子字符串:注意事项String substring() …...
2025年七星棋牌跨平台完整源码解析(200+地方子游戏+APP+H5+小程序支持,附服务器镜像导入思路)
目前市面上成熟的棋牌游戏源码很多,但能做到平台全覆盖、地方玩法丰富、交付方式标准化的系统却不多。今天这套七星棋牌2023完整源码具备安卓/iOS/H5/微信小程序端四端互通能力,附带200多款地方子游戏,还配备了后台管理与自动热更系统&#x…...
Odoo 部署本地 把現時的excel計算表格部署上odoo 教程
要将现有的 Excel 计算表格部署到 Odoo 平台上,您可以按照以下步骤进行操作: 将 Excel 表格中的数据转移到 Odoo 模块中:首先,您需要将 Excel 表格中的数据导出为 CSV 格式,然后可以使用 Odoo 的数据导入功能将这些数据…...
compose map 源码解析
目录 TileCanvas ZoomPanRotateState ZoomPanRotate 布局,手势处理完了,就开始要计算tile了 MapState TileCanvasState telephoto的源码已经分析过了.它的封装好,扩展好,适用于各种view. 最近又看到一个用compose写的map,用不同的方式,有点意思.分析一下它的实现流程与原…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
mysql事务脏读 不可重复读 幻读 事务隔离级别关系
看了很多文档,发现针对事务并发执行过程中的数据一致性问题,即脏读、不可重复读、幻读的解释一塌糊涂,这也不能说什么,因为官方SQL标准中的定义也模糊不清。 按照mysql中遵循的事务隔离级别,可以梳理一下其中的关系 隔…...
智慧乡村数字化农业全产业链服务平台建设方案PPT(99页)
1. 农业全产业链概念 农业全产业链是依托数字化、电子商务、云计算等技术,整合规划咨询、应用软件设计与开发等服务,推动农业产业升级和价值重塑,构建IT产业融合新生态。 2. 产业链技术支撑 利用云计算、大数据、区块链等技术,为…...
信息系统项目管理师-软考高级(软考高项)2025最新(二)
个人笔记整理---仅供参考 第二章信息技术发展 2.1信息技术及其发展 2.1.1计算机软硬件 2.1.2计算机网络 2.1.3存储和数据库 2.1.4信息安全 公钥公开,私钥保密 2.1.5信息技术的发展 2.2新一代信息技术及应用 2.2.1物联网 2.2.2云计算 2.2.3大数据 2.2.4区块链 2.2.5…...
基于Springboot+Mysql的闲一品(含LW+PPT+源码+系统演示视频+安装说明)
系统功能 管理员功能:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理。用户功能:首页、个人中心、订单评价管理、我的收藏管理、订单管理。前台首页功能:首页、零食信息、零食资讯、个人中心、后…...
索引下推(Index Condition Pushdown, ICP)
概念 索引下推是一种数据库查询优化技术,通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况,因为它可以在索引扫描阶段就排除不符合全部条件的数据行,而不是将所有可能匹配的记录加载到服务器层再进行…...
Transformer模型在自然语言处理中的实战应用
基于BERT的文本分类实战:从原理到部署 一、Transformer与BERT核心原理 Transformer模型通过自注意力机制(Self-Attention)突破了RNN的顺序计算限制,BERT(Bidirectional Encoder Representations from Transformers)作为其典型代表,具有两大创新: 双向上下文编码:通过…...
stm32week11
stm32学习 八.stm32基础 2.stm32内核和芯片 F1系统架构:4个主动单元和4个被动单元 AHB是内核高性能总线,APB是外围总线 总线矩阵将总线和各个主动被动单元连到一起 ICode总线直接连接Flash接口,不需要经过总线矩阵 AHB:72MHz&am…...
ConcurrentHashMap 源码分析
摘要 介绍线程安全集合类 ConcurrentHashMap 源码,包括扩容,协助扩容,红黑树节点读写线程同步,插入元素后累加键值对数量操作原子性实现。 1 成员变量及其对应的数据结构 底层由数组红黑树链表实现volatile long baseCount 和 v…...
Python数据可视化:从脚本到海报级图表
Python数据可视化:从脚本到海报级图表 引言 在数据分析和科学计算领域,Python 是一种强大且灵活的工具。本文将带您了解如何使用 Python 进行数据可视化,从简单的脚本到生成高质量的海报级图表。我们将重点介绍如何使用 Matplotlib 库来创建、保存和优化图表,以便在各种场…...
【Python语言基础】19、垃圾回收
文章目录 1. 垃圾回收1.1 引用计数-日常检查货物标签1.2 标记-清除算法:处理互相依赖的货物1.3 分代回收:根据货物新旧安排清理频率 2. 特殊方法2.1 构造和析构方法2.2 字符串表示方法2.3 比较方法2.4 容器相关方法2.5 可调用对象方法 1. 垃圾回收 计算…...
