当前位置: 首页 > news >正文

25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)

⭐上篇模板文章:24. C++模板 2 (非类型模板参数,模板的特化与模板的分离编译)-CSDN博客

⭐本篇代码:c++学习 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)

⭐标⭐是比较重要的部分

目录

一. 继承的基础使用

1.1 继承的格式

1.2 代码举例

1.3 派生类访问基类成员的变化⭐

二. 继承的复制兼容规则 ⭐

 三. 继承中的作用域

3.1 基类可以访问父类成员函数

3.2 基类与派生类的重定义


一. 继承的基础使用

        继承的面向对象程序设计提高代码复用的重要手段,它允许我们在保持原有类的成员的基础上对这个类进行拓展。之前我们大多都是函数的复用,继承是类的复用。

        被继承的类称为基类(父类),继承基类的类称为派生类(子类)。

        比如我们有一个person类,而学生,职工,教师等类都有着person类的属性(年龄,性别,电话,身份证等)而学生有自己特有的学号,教师职工有自己的工号。

        此时我们就能通过继承让学生,教师,职工类获取person的成员,还能重新定义自己特有的成员。

1.1 继承的格式

class Person
{};class Student :public Person
{};

在新定义的类后面使用一个 : 后面依次接 继承方式 基类

 

1.2 代码举例

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "张三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年龄:" << _age << endl;}
private:size_t _age;string _name;
};class Student :public Person
{
private:string _stuid;
};class Teacher :public Person
{
private:string _tcid;
};int main()
{Person p1;p1.print();Student st1;st1.print();Teacher tc1;tc1.print();return 0;
}

上面代码中我们定义一个person类,在定义学生和教师类来继承person 。

我们都调用print函数,运行结果如下:

可见:学生类和教师类(派生类)都能够继承person类(基类)的姓名,年龄和print函数

1.3 派生类访问基类成员的变化⭐

        继承的方式有三种,public,protected,private。不同的继承方式,子类访问父类有限定。

类成员/继承方式public继承protected继承private继承
基类public成员派生类public成员派生类protected成员派生类private成员
基类protected成员派生类protected成员派生类protected成员派生类private成员
基类private成员派生类不可访问派生类不可访问派生类不可访问

 根据上述表格,我们可以有以下总结

1 基类的private成员在派生类中不可见。即这个成员被派生类继承,但是在派生类的类内类外都无法访问基类的private成员

2 protected继承就是为了解决基类private成员无法在派生类访问的问题(即如果我们想要在派生类访问基类的私有成员,在基类中将其定义为protected成员即可)

3 实际上,为了提高代码的复用和拓展。我们一般都使用public继承

4 class定义类的默认继承方式是private,struct定义类的默认继承方式是public。不过我们在使用中一般都会显示定义类的继承方式。

 

 若是保护成员,在派生类中可以访问

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "张三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年龄:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
public:void show(){cout << "姓名:" << _name << " 年龄:" << _age << endl;}
private:string _stuid;
};int main()
{Person p1;p1.print();Student st1;st1.show();return 0;
}

我们在Student类中定义一个show函数来访问基类的保护成员

二. 继承的复制兼容规则 ⭐

派生类的对象可以赋值给 基类,基类的指针,基类的引用(称为切片,切割)

基类的对象不能赋值给派生类

基类的指针在特定情况下可以强制转化为派生类的指针

代码举例:

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "张三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年龄:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
public:void set(int age, const string& name,int stuid){_age = age;_name = name;_stuid = stuid;}void show(){cout << "姓名:" << _name << " 年龄:" << _age << " ID:" << _stuid << endl;}
private:string _stuid;
};int main()
{Student st1;st1.set(50, "李四", 123456);st1.print();Student st2;Person p1 = st1;	//直接赋值p1.print();Person* p2 = &st2;	//基类指针p2->print();Person& p3 = st2;	//基类引用p3.print();return 0;
}

运行结果如下:

 若是将基类赋值给派生类就会报错

 ​​​​​​

 三. 继承中的作用域

1 在继承中,基类和派生类有自己独立的作用域。对于派生类来说,调用成员的时候会现在自己的类中寻找,如果自己的类中没有定义,再去基类中寻找成员

基类和其派生类有相同名称的成员,派生类会隐藏基类的成员。这两个成员构成重定义。

3 重定义不是重载。虽然两个成员名称相同,但是它两的作用域不一样,不是重载

3.1 基类可以访问父类成员函数

举例代码如下:基类没有print函数,会去父类寻找并调用print函数

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "张三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年龄:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
private:string _stuid;
};int main()
{Student st1;st1.print();return 0;
}

测试结果如下:

 

3.2 基类与派生类的重定义

如果父子类有重定义,子类无法直接调用父类的成员

 

调用自己的成员

#include <iostream>
using namespace std;class A
{
public:void f() { cout << "hello world!" << endl; }
};class B :public A
{
public:void f(int i) { cout << "hello world!" << i << endl; }
};int main()
{A a;B b;a.f();b.f(10);return 0;
}

 如果父子类构成重定义,子类想要访问父类同名成员,需要指定作用域

相关文章:

25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)

⭐上篇模板文章&#xff1a;24. C模板 2 (非类型模板参数&#xff0c;模板的特化与模板的分离编译)-CSDN博客 ⭐本篇代码&#xff1a;c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. 继承的基础使用 1.1 继承的格式 1.2 …...

git 退出编辑模式

在使用 Git 时&#xff0c;有时需要进入编辑器来输入提交信息或进行其他编辑操作。不同的系统和配置可能会导致使用不同的编辑器。以下是几种常见 Git 编辑器的退出方法&#xff1a; ‌Vim 编辑器‌&#xff1a; ‌保存并退出‌&#xff1a; 按下 Esc 键退出编辑模式。输入 :w…...

内容营销与传统营销方式有哪些差别?

在互联网高度发达的当下&#xff0c;碎片化的信息接收方式&#xff0c;让用户对于营销信息拥有较高的敏感度。这一现状&#xff0c;也使得众多传统营销方式正在逐渐失效。想要稳定推广效率&#xff0c;内容营销是当下不少品牌的共同选择。接下来&#xff0c;就让我们来了解下内…...

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx&#xff08;具有两个sheet&#xff09;2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...

【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】

【华为OD-E卷 - 机房布局 100分&#xff08;python、java、c、js、c&#xff09;】 题目 小明正在规划一个大型数据中心机房&#xff0c;为了使得机柜上的机器都能正常满负荷工作&#xff0c;需要确保在每个机柜边上至少要有一个电箱。 为了简化题目&#xff0c;假设这个机房…...

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…...

ChatBI来啦!NBAI 正式上线 NL2SQL 功能

NebulaAI 现已正式上线 NL2SQL 功能&#xff0c;免费开放使用&#xff01; 什么是 NL2SQL&#xff1f;NL2SQL 即通过自然语言交互&#xff0c;用户可以轻松查询、分析和管理数据库中的数据&#xff08;ChatBI&#xff09;&#xff0c;从此摆脱传统复杂的数据库操作。 欢迎免费…...

8. Web应用程序(Web)

8. Web应用程序&#xff08;Web&#xff09; Spring Boot 非常适用于Web应用程序开发。你可以使用嵌入式 Tomcat、Jetty、Undertow或Netty创建一个独立的HTTP服务器。大多是Web应用程序都会使用 spring-boot-starter-web 依赖模块来快速启动和运行项目。你也可以选择使用 spri…...

Linux内核修改内存分配策略

今天遇到了如下的内核报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f0e1e06c000, 65536, 1) failed; errorCannot allocate memory (errno12)这个报错是因为&#xff0c;linux会对大部分的内存资源申请都回复允许&#xff0c;以便于运行更…...

六大亮点解析:AI视频监控助力部队训练安全管理

一、用户痛点&#xff1a; 在部队的日常训练和任务执行中&#xff0c;官兵的安全始终是最为重要的保障。然而&#xff0c;传统的监控方式存在显著的局限性&#xff0c;尤其是在高强度、长时间的训练过程中&#xff0c;人工值守监控容易产生疲劳&#xff0c;误判的风险大&#…...

【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释

文章目录 一、委托&#xff08;Delegate&#xff09;1、什么是委托&#xff1f;2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件&#xff08;event &#xff09;1、事件是什么…...

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…...

深入浅出 Spring(一) | Spring简介、IOC理论推导、快速上手 Spring

1. spring 1.1 简介 Spring : 春天 —>给软件行业带来了春天 2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发布了1.0正式版。 很难想象…...

IDEA 社区版 SpringBoot不能启动

报错原因&#xff0c;Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…...

职场常用Excel基础01-数据验证

大家好&#xff0c;excel在职场中使用非常频繁&#xff0c;今天和大家一起分享一下excel中数据验证相关的内容~ 在Excel中&#xff0c;数据验证&#xff08;Data Validation&#xff09;是一项非常有用的功能&#xff0c;它可以帮助用户限制输入到单元格中的数据类型和范围&am…...

活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;数据基础知识”活动&#xff0c;了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动&#xff0c;你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间&#xff1a;01 月 07 日…...

RabbitMQ - 1 ( 7000 字 RabbitMQ 入门级教程 )

一&#xff1a; 在互联网行业&#xff0c;许多公司喜欢用动物命名产品或作为公司的 Logo 和吉祥物&#xff0c;比如腾讯的企鹅、京东的狗、美团的袋鼠、携程的海豚&#xff0c;而阿里更是凭借蚂蚁、飞猪、天猫、菜鸟、闲鱼、盒马等&#xff0c;打造了一座“动物园”。Rabbit&a…...

Docker Compose 构建 EMQX 集群 实现mqqt 和websocket

EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …...

Spring 过滤器:OncePerRequestFilter 应用详解

在Web应用中&#xff0c;过滤器&#xff08;Filter&#xff09;是一个强大的工具&#xff0c;它可以在请求到达目标资源之前或响应返回客户端之前对请求或响应进行拦截和处理。然而&#xff0c;在某些情况下&#xff0c;我们可能希望确保过滤器逻辑在一次完整的HTTP请求中仅执行…...

3.CSS字体属性

3.1字体系列 CSS使用font-family属性定义文本的字体系列。 p{font-family:"微软雅黑"} div{font-family:Arial,"Microsoft Yahei",微软雅黑} 3.2字体大小 css使用font-size属性定义字体大小 p{ font-size:20px; } px(像素)大小是我们网页的最常用的单…...

OBS智能跟拍插件:3分钟实现直播自动追踪的终极指南

OBS智能跟拍插件&#xff1a;3分钟实现直播自动追踪的终极指南 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker 您是否在直播时经常为手动调整摄像头而烦恼&#xff1f;是否希望…...

风云三国2.4问鼎天下:不靠作弊代码,用TXT文件修改实现俘虏名将和强制投降

风云三国2.4问鼎天下&#xff1a;TXT文件修改实现俘虏名将与强制投降的硬核技巧 在《风云三国2.4问鼎天下》这款经典MOD中&#xff0c;许多玩家都渴望能够招降那些赫赫有名的武将&#xff0c;比如关羽、诸葛亮等&#xff0c;但游戏机制往往让这些名将难以归顺。传统的作弊代码虽…...

2026年初中生赴新加坡留学,费用究竟几何?一文为你揭秘!

在教育全球化的今天&#xff0c;越来越多的家长将目光投向海外&#xff0c;新加坡凭借其优质的教育资源、安全的社会环境和多元的文化氛围&#xff0c;成为众多初中生留学的热门选择。那么&#xff0c;2026年初中生赴新加坡留学的费用到底是多少呢&#xff1f;本文将为你详细揭…...

51单片机电子秤的语音播报怎么选?JQ8400模块 vs OTP芯片,实测成本与易用性对比

51单片机电子秤语音方案实战选型&#xff1a;JQ8400模块与OTP芯片的深度拆解 在智能硬件开发中&#xff0c;语音交互功能正从锦上添花的附加项逐渐变为核心用户体验的关键组成部分。以51单片机电子秤为例&#xff0c;语音播报功能不仅能提升产品的无障碍使用体验&#xff0c;还…...

华硕笔记本终极控制工具G-Helper:如何用免费轻量软件完全替代臃肿的Armoury Crate?

华硕笔记本终极控制工具G-Helper&#xff1a;如何用免费轻量软件完全替代臃肿的Armoury Crate&#xff1f; 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Stri…...

树莓派网页编辑器:云端开发环境革新与实战指南

1. 项目概述&#xff1a;一次开发体验的“降维”革新最近&#xff0c;树莓派基金会悄无声息地放出了一个重磅工具&#xff1a;一个可以直接在网页浏览器里运行的代码编辑器。这个消息乍一听&#xff0c;可能不如发布一块新的、性能翻倍的树莓派单板计算机那么激动人心&#xff…...

英雄联盟个性化工具LeaguePrank:安全自定义你的游戏身份

英雄联盟个性化工具LeaguePrank&#xff1a;安全自定义你的游戏身份 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank LeaguePrank是一款基于英雄联盟官方LCU API开发的免费开源工具&#xff0c;允许玩家安全、合法地自定义游戏…...

【普中 51-Ai8051 开发攻略】-- 第 30 章 OLED 液晶显示实验-硬件 IIC

(1)实验平台&#xff1a; 普中 51-Ai8051 开发板​​https://item.taobao.com/item.htm?abbucket17&id1026052331067(2)资料下载 &#xff1a;普中科技-各型号产品资料下载链接 前面已经使用 IO 口软件模拟 IIC 时序与 OLED 通信实现字符汉字的显示。 本章学习使用 AI805…...

告别手动Coding:用EB tresos Studio配置TC3xx芯片MCAL的保姆级图文指南

告别手动Coding&#xff1a;用EB tresos Studio配置TC3xx芯片MCAL的保姆级图文指南 当TC3xx系列芯片遇上AUTOSAR架构&#xff0c;传统寄存器级开发方式正在被图形化配置彻底革新。对于每天需要面对微控制器底层驱动的嵌入式工程师而言&#xff0c;EB tresos Studio提供的可视化…...

盲人出行辅助系统原型

我做了一个很有意义的盲人出行辅助系统原型&#xff0c;主要是结合现有导航OSRM/高德&#xff0c;实时感知前方潜在危险目标&#xff0c;辅助视障人士出行。 持续优化中&#xff08;20260519&#xff09;&#xff0c;欢迎大家尝试&#xff0c;有一些想法也可以提出来。 开源地址…...