C++:类进阶之继承与派生

news2024/9/17 8:28:26

一、基本概念:继承、基类、派生类

继承:在定义一个新的类B时,如果该类与某个已有的类A相似 (指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类 (也称子类)。

派生类:通过对基类进行修改和扩充得到的类。

(1)扩充: 在派生类中,可以添加新的成员变量和成员函数

(2)修改: 在派生类中,可以重新编写从基类继承得到的成员

(3)覆盖:在派生类中,可以定义一个和基类成员同名的成员,这叫覆盖。在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::。

派生类一经定义后,可以独立使用,不依赖于基类。

派生类定义方式:class 派生类名:派生方式说明符 基类名{...}

派生方式说明符有三种,分别是public,private,protected

派生类对象的大小,等于基类对象的大小加上派生类对象自己的成员变量的大小。在派生类对象中,包含着基类对象和本身新增的对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。

二、派生类的成员组,可见性

公有继承 (public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

1.基类成员对其对象的可见性:

公有成员可见,其他不可见。这里保护成员同于私有成员。

2.基类成员对派生类的可见性:

公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。

3.基类成员对派生类对象的可见性:

公有成员可见,其他成员不可见。

私有继承 (private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

1.基类成员对其对象的可见性:

公有成员可见,其他成员不可见。

2.基类成员对派生类的可见性:

公有成员和保护成员是可见的,而私有成员是不可见的。

3.基类成员对派生类对象的可见性:

所有成员都是不可见的。

保护继承 (protected)

1.基类成员对其对象的可见性:

公有成员可见,其他不可见。这里保护成员同于私有成员。

2.基类成员对派生类的可见性:

公有成员和保护成员是可见的,而私有成员是不可见的。

3.基类成员对派生类对象的可见性:

所有成员都是不可见的。

与私有继承方式的情况相同。两者的区别仅在于对派生类的派生类成员而言,对基类成员有不同的可见性。

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

=>

另一种存取权限说明符:protected

基类的private成员:可以被下列函数访问

1.基类的成员函数

2.基类的友元函数

基类的public成员:可以被下列函数访问

1.基类的成员函数

2.基类的友元函数

3.派生类的成员函数

4.派生类的友元函数

5.其他的函数

基类的protected成员:可以被下列函数访问

1.基类的成员函数

2.基类的友元函数

3.派生类的成员函数

4.派生类的友元函数

三、派生类的构造,析构

①派生类的构造函数

我们创建一个武器weapon类,sword类作为weapon的派生类,继承类型为public

我们在创建一个sword类时,会自动生成一个与之对应的weapon类,那么这时在书写sword构造函数时,就应当考虑weapon如何初始化,即要考虑weapon的构造函数。

可见这样的写法行不通的,因为public继承无法访问基类的private成员,我们应该通过调用weapon的成员函数才能访问weapon的private成员变量,然后对其进行初始化,即调用weapon自己的构造函数。

注意:在执行一个派生类的构造函数之前,总是先执行基类的构造函数。

②派生类的析构函数

我们在析构一个派生类时,同理应当考虑基类的析构,方式与处理构造函数时类似。

注意:派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数。即先调用派生类析构函数,再调用基类析构函数。

四、派生类与基类的指针类型转换

(1)Public 继承的赋值兼容规则:

1.派生类的对象可以赋值给基类对象

2.派生类对象可以初始化基类引用

3.派生类对象的地址可以赋给基类指针

(反之均不成立)

(2)基类与派生类的指针强制转化:

(要求:public继承)

我们可以把base_ptr视作一个Base类的对象,可以通过它直接访问Base类的成员(尽管他实际指向的是一个派生类对象),但是我们无法通过它直接访问派生出来的Derived类中的成员,即不能通过它访问属于Derived类但并不属于Base类的成员。

我们可以通过强制类型转换把base_ptr重新转换成Derived类的指针

五、直接基类和间接基类

如果A派生B,B派生C,C派生D....

那么我们称

A为B的直接基类,为C、D的间接基类

B为C的直接基类,为D的间接基类

C为D的直接基类

在声明派生类时,只需要列出其直接基类,然后派生类会自动向上继承其间接基类。

派生类的成员包括了其自身的成员、直接基类的成员、间接基类的成员。

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

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

相关文章

微前端技术预研 - bit初体验

1.关于什么是微前端以及微前端的发展, 当前主流框架以及实现技术等,可参考这篇总结(非常全面), 微前端总结:目录详见下图 本文内容主要针对bit框架的实时思路以及具体使用。 1.什么是Bit? Bit 是可组合软件的构建…

《C语言实现各种排序算法》

文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序3、快速排序hoare找基准值4、快排挖坑法找基准值5、前后指针法6、快速排序非递归实现 五…

甄选范文“论数据分片技术及其应用”软考高级论文,系统架构设计师论文

论文真题 数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。 请围绕“论数据分片技术及其应用”论题…

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…

具身智能,存内计算芯片应用新赛道

引言: 具身智能(Emboided Al)是指通过身体与环境的动态互动,实现对世界的感知、认知和行为控制的智能系统。具身智能强调的是智能体与环境的交互/学习/改变,而不仅仅是身体本身。具身智能的核心要素体现在智能体通过…

MySQL --- 数据类型

一、类型分类 数值类型bit(M)位类型,M指定位数,默认值1,范围1 - 64bool使用0和1表示真假tinyint [unsigned]带符号范围 -128~127,无符号范围 0~255,默认有符号smallint [unsigned]带符号范围 -2^15~2^15-1&#xff0c…

【网络世界】HTTPS协议

目录 🌈前言🌈 📁 HTTP缺陷 📁 HTTPS 📂 概念 📂 加密 📂 加密方式 📁 中间人攻击 📁 CA机构和证书 📂 数据摘要(数据指纹) &…

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机:192.168.118.60 这台主机只发布了web服务,没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…

【OpenCV-Python实战项目】26-实时手部跟踪

0 介绍 目的:使用mediapipe库做手部的实时跟踪 检测流程:(1)手掌检测;(2)手掌特征检测 手掌特征分布:mediapipe手掌特征分布如下: 1.环境要求 后续代码运行环境&…

力扣SQL50 换座位

Problem: 626. 换座位 👨‍🏫 参考题解 Code SELECT(CASEWHEN MOD(id, 2) ! 0 AND counts ! id THEN id 1WHEN MOD(id, 2) ! 0 AND counts id THEN idELSE id - 1END) AS id,student FROMseat,(SELECTCOUNT(*) AS countsFROMseat) AS seat_counts O…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(中)

2.综述 (续上篇) 上篇地址:http://t.csdnimg.cn/DBKrg 2.2DLMS/COSEM应用层主要特点 2.2.1DLMS/COSEM应用层结构 DLMS/COSEM AL的主要部件是应用服务对象(ASO)。它给其服务用户提供服务(COSEM应用进程),并使用支撑层提供的服务。客户机和服务器侧都包含三个必…

Image Caption评估指标深入理解

前言:刚开始做图像描述的任务就整理了这些评估指标,时间久远有点记不清怎么具体实现原理了,结果面试的时候就问了这个问题,没答上来,郁闷了很久,还是基础不扎实,浅浅记录一下 文章目录 BLEUROUG…

C语言的结构体

结构体定义 结构体指针

【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)

目录 1.题目 2,算法原理 ​编辑 1.哈希表 2.left和right指针的移动 3.滑动窗口的执行次数 3.代码实现 1.C代码 2.C语言代码 4.C知识点 1. std::vector 2. std::string 3. std::unordered_map 4. 迭代器 5. 范围循环 (range-based for loop) 6. 动…

0基础学会无代码在亚马逊云科技AWS上利用LLM和智慧体(Agent)开发客服机器人

简介: 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。 本次介绍的是如何利用亚马逊云科技大模型托管服…

【解决方法】git clone出现 curl 56 OpenSSL SSL_read: Connection was reset, errno 10054

当我们克隆别人的项目出现以下提示信息时候 remote: Enumerating objects: 7095, done. error: RPC failed; curl 56 OpenSSL SSL_read: Connection was reset, errno 10054 error: 2292 bytes of body are still expected fetch-pack: unexpected disconnect while reading s…

Python(C++)大尺度分层边值时变图统计推理并行算法

🎯要点 🎯分层结构制定生成模型 | 🎯贝叶斯模型选择程序 | 🎯分层结构图的信息性 | 🎯分层模型适应实值边协变量的网络 | 🎯分层模型适应时变网络,划分层对应于检测变化点 | 🎯定义…

Python中15个让你代码更优雅的上下文管理器用法

文末赠免费精品编程资料~~ 今天,我们要探索的是Python中一个超级实用又往往被低估的特性——上下文管理器。这可不是普通的魔法,它能让你的代码更加整洁、安全,还能自动处理资源,就像变魔术一样。准备好,让我们一起揭…

一分多行列转换(Gbase版)

1、源数据表结构 CREATE TABLE "sf_ref_pd_config" ("I_BATCH_NO" decimal(5,0) DEFAULT NULL COMMENT 批次ID,"V_ASSET_CLASS_NAME" varchar(200) DEFAULT NULL COMMENT 资产类型,"N_EXEC_ID" decimal(5,0) DEFAULT NULL COMMENT 执…

pyjwt:Python 中的 JWT 处理专家

文章目录 探索 pyjwt:Python 中的 JWT 处理专家简介:为何选择 pyjwt?什么是 pyjwt?安装 pyjwtpyjwt 的基本使用1. 编码JWT2. 解码JWT3. 验证签名4. 过期时间5. 自定义头部 场景应用场景一:用户登录场景二:A…