基类与派生类对象的关系 派生类的构造函数
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🐰 基类与派生类对象的关系
🐰派生类的构造函数
🐰 基类与派生类对象的关系
前提引入:
公用派生类具有基类的全部功能(可以通过基类的公用成员函数访问基类的私有成员),所有基类能够实现的功能,公用派生类都能实现。而非公用派生类(私有或保护派生类)不能实现基类的全部功能。因此,基类对象与公用派生类对象之间有赋值兼容关系。
(1)公用派生类对象可以向基类对象赋值
由于公用派生类具有基类所有成员,所以把公用派生类的对象赋给基类对象
Person person("Marry","F",19);//定义基类Person对象person //定义基类Person的公用派生类Student的对象student Student student("Marry","F",19,"214210203","2021.9.1",680); person=student;注意:在赋值时时舍弃派生类新增成员,所谓的赋值只对数据成员赋值,对成员函数不存在赋值
注意:基类对象是不能对公用派生类进行赋值,例如student=person是不存在的。因为基类成员中不包含派生类的新增成员,无法对派生类新增成员赋值,同一基类的不同派生类的对象之间也不能进行赋值。
(2)公用派生类对象可以代替基类对象向基类对象的引用进行赋值或初始化
Person person("Marry","F",19); Student student("Marry","F",19,"214210203","2021.9.1",680); //定义基类Person的对象引用personref,并用person对其初始化 Person &personref=person; //也可以用对象student对引用personref进行初始化,将上面的语句Person &personref=person;修改为 Person &personref=student; //或者 Person &personref=person; personref=student;//用派生类对象student对person的引用personref赋值
同样,公用派生类对象的地址可以代替基类对象地址向指向基类对象的指针进行赋值或初始化,即指向基类对象的指针也可以指向公用派生类对象。但是通过指向基类对象的指针只能访问公用派生类对象中基类成员,而不能访问公用派生类对象新增的成员。
(3)如果函数参数是基类对象或基类对象的引用,相应的实参可以使用公用派生类对象。
例如:
void show(Person &ref) {cout<<ref.show()<<endl; } 则调用函数show时可以使用基类Person的公用派生类对象作为实参: //定义基类Person的公用派生类Student的对象student Student student("Marry","F",19,"214210203","2021.9.1",680); show(student);同样,如果函数的参数是指向基类的对象的指针,相应的实参可以为公用派生类的对象的地址。
void show(Person *p) {Cout<<p->show()<<endl; } 则在调用函数show时可以使用student的地址作为实参: Show(&student);
🐰派生类的构造函数
派生类的构造函数
构造函数的作用是创建对象时对对象的数据成员进行初始化。派生类数据成员包括从基类继承过来的数据成员和自己新增加的数据成员,但是派生类并不能直接初始化从基类继承过来的数据成员,他必须使用基类的构造函数来初始化它们,在派生类构造函数的初始化列表中写出对基类构造函数的调用。
派生类的构造函数:#include<iostream> using namespace std; class Person { public:Person()//无参的默认构造函数{;}Person(string Name,string Sex,int Age):name(Name),sex(Sex),age(Age)//有参的构造函数{cout<<"The constructor of base class Person is called. "<<endl;}void show(){cout<<"The person's name:"<<name<<endl;cout<<" sex:"<<sex<<endl;cout<<" age:"<<age<<endl;}~Person()//默认的析构函数{;} protected:string name;string sex;int age=0; }; class Student:public Person//声明基类Person的公用派生类Student { public:Student()//无参的默认构造函数{;}Student(string Name,string Sex,int Age,string Id,string Date,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score)//有参的构造函数,在初始化列表中调用基类的构造函数{cout<<"The constructor of base class Student is called. "<<endl;}void stushow(){cout<<" student's id:"<<id<<endl;cout<<" name:"<<name<<endl;cout<<" sex:"<<sex<<endl;cout<<" age:"<<age<<endl;cout<<" date:"<<date<<endl;cout<<" score:"<<score<<endl;}~Student(){;} protected:string id;string date;float score=0.0; }; int main() {Student stu("Marry","man",19,"214210203","2021.09.01",523);stu.show();stu.stushow();return 0; } 运行结果: The constructor of base class Person is called. The constructor of base class Student is called. The person's name:Marrysex:manage:19student's id:214210203name:Marrysex:manage:19date:2021.09.01score:523Student(string Name,string Sex,int Age,string Id,string Date,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score)//有参的构造函数,在初始化列表中调用基类的构造函数冒号前面是派生类Student构造函数的主干,它和以前的构造函数形式相同,但是它的总参数列表中包含着调用基类Person的构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。通过冒号后面的初始化列表完成将参数传递给基类的构造函数和对派生类新增数据成员的初始化工作。派生类构造函数的具体执行过程:先调用基类的构造函数,对派生类对象从基类继承过来的数据成员(name,sex,age)进行初始化。接下来初始化派生类新增的数据成员(id,date,score)。最后执行派生类构造函数的函数体。定义派生类的构造函数,以下几种情况需要注意:(1)多级派生类的构造函数。一个类不仅可以派生出一个类,派生类还可以继续派生,形成派生的层次结构。在派生层次结构中,每一层派生类的构造函数只负责调用其上一层(即它的直接基类)的构造函数。例如,在派生类Student再派生出派生类Graduate,则派生类Gradute的构造函数如下:class Gradute:public Student { public:Gradute(){;}Gradute(string Name,string Sex,int Age,string Id,string Date,float Score,stringDirect,string Teacher):Student(Name,Sex,Age,Id,Date,Score),direct(Direct),teacher(Teacher){cout<<"The constructor of base class Gradute is called. "<<endl;}void gradShow(){cout<<" student's id:"<<id<<endl;cout<<" name:"<<name<<endl;cout<<" sex:"<<sex<<endl;cout<<" age:"<<age<<endl;cout<<" date:"<<date<<endl;cout<<" score:"<<score<<endl;cout<<" direct:"<<direct<<endl;cout<<" teacher:"<<teacher<<endl;} protected:string direct;string teacher; };(2)当不需要对派生类新增的成员进行任何初始化操作时,此派生类构造函数的作用只是为了将参数传递给基类构造函数。(3)如果基类中没有定义构造函数,或者定义了没有构造参数的构造函数那么在定义派生类构造函数时,在其初始化列表中可以不写对基类构造函数的调用。在调用派生类构造函数时,系统会自动调用基类的默认构造函数。如果基类中定义了无参构造函数,又定义了有参的构造函数(构造函数的重载),则在定义派生类构造函数时,在其初始化列表中既可以包含对基类构造函数的调用,也可以不用,根据创建派生类的需求来采用哪种方式。
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸
相关文章:
基类与派生类对象的关系 派生类的构造函数
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…...
【算法】生成分布式 ID 的雪花算法
ID 是数据的唯一、不变且不重复的标识,在查询数据库的数据时必须通过 ID 查询,在分布式环境下生成全局唯一的 ID 是一个重要问题。 雪花算法(snowflake)是一种生成分布式环境下全局唯一 ID 的算法,该算法由 Twitter 发…...
Linux系统编程 - 基础IO(IO操作)
目录 预备知识 复习C文件IO相关操作 printf相关函数 fprintf snprintf 读取文件 系统文件IO操作 open函数 umask()函数 open函数返回值 预备知识 1.你真的理解文件原理和操作了吗?不是语言问题,是系统问题2.是不是只有C/C有文件操作呢&#x…...
基于 Avue 的 CRUD 表格组件封装
在 components 文件夹中,创建一个新的 .vue 文件,例如:AvueCrudTable.vue。 透传父组件传递的属性和事件 : 1、利用v-bind=“ a t t r s " 支持所有 a v u e 的使用方法并在其基础上进行封装 2 、使用 v − o n = " attrs"支持所有 avue 的使用方法并在其基…...
树莓派学习笔记(十三)基于框架编写驱动代码
文章目录一、代码分析:二、源码一、代码分析: 在内核中由于代码文件多,避免函数名重复,使用static将函数的作用域限制在该文件内 内核的打印函数printk和printf类似 file_operations结构体使用符号“ . ”指定参数,省…...
vue事件修饰符之.prevent
.prevent 事件修饰符只是阻止默认事件,不会自动触发任何事件处理函数。因此,在使用 .prevent 事件修饰符时,需要自己编写相应的事件处理函数来处理事件。 例如,在上面的例子中,我们通过在表单上绑定 submit.prevent&q…...
【SpringCloud AlibabaSentinel实现熔断与限流】
本笔记内容为尚硅谷SpringCloud AlibabaSentinel部分 目录 一、Sentinel 1、官网 2、Sentinel是什么 3、下载 4、特性 5、使用 二、安装Sentinel控制台 1、sentinel组件由2部分构成 2、安装步骤 1.下载 2.运行命令 3.访问sentinel管理界面 三、初始化演示工程 …...
类与对象-封装
一、封装的意义封装是C面向对象三大特性之一语法: class name { 访问权限:属性行为 };注意:类中的属性和行为 统称为成员属性 又称 成员属性 / 成员变量行为 又称 成员函数 / 成员方法封装将属性和行为作为一个整体,表现生活中的事物例①&…...
【回忆杀】2012年拥有第一台电脑【致逝去的青春】
高中说起 在2012年的时候吧,高考过后,那个时候一门心思的想当一名体育老师【现在居然还有这个想法,哈哈】,最后没有考上自己希望的大学我记得好像是2012年7月的时候就去重庆投靠朋友,他教我做模具,2012年做…...
PointNeXt: Revisiting PointNet++ with Improved Training and Scaling Strategies
Abstract PointNet 是点云理解领域最有影响力的神经网络架构之一。虽然近期出现了 PointMLP 和 Point Transformer 等新型网络,它们的精度已经大大超过了 PointNet,但我们发现大部分性能提升是由于改进的训练策略,例如数据增强和优化技术以及…...
打印九九乘法表-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)
【案例2-9】打印九九乘法表 一、案例描述 考核知识点 for双重循环 练习目标 掌握for循环应用。实现九九乘法表。 需求分析 九九乘法表相信大家一点也不陌生,之前见到的乘法表是印刷在课程本之上的。而在本案例中我们将用JavaScript代码来实现九九乘法表。 案例分…...
【Linux】基于阻塞队列的生产者消费者模型
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉为何要使用…...
【华为OD机试 2023最新 】 真正的密码(C++)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码, 在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的…...
差分算法(蓝桥杯复习+例题讲解+模板c++)
文章目录差分介绍差分应用区间加区间求和总结3729. 改变数组元素100. 增减序列文章首发于:My Blog 欢迎大佬们前来逛逛 差分介绍 差分是一种常见的算法,用于快速修改数组中某一段区间的值。 差分的思想就是预处理出数组的差分数组,然后修改…...
CSS+ JS 实现手电筒效果
前言概述 JavaScript 结合 CSS 打造的一款图片特效,当鼠标拖拽滑块时,让本该置灰的图片局部恢复本来的颜色。且该效果随着你的鼠标的按下时的移动而移动。 核心功能 图片置灰 拖拽功能 让滑块位置处的图片恢复本来的颜色 实现原理 这个的实现原理并不…...
2021地理设计组二等奖:基于InSAR和指数分析的地面沉降风
作品简介 一、作品背景 地面沉降是指地面高程的降低, 又称地面下沉或地沉, 是以缓慢、难以察觉的向下垂直运动为主, 是指在自然和人为因素作用下, 由于地壳表层土体压缩而导致区域性地面标高降低的一种环境现象。目前, 地面沉降己成为城市化进程中普遍存在的生态环境问题, 成为…...
计算机操作系统(第四版)第二章进程的描述与控制—课后习题答案
1.什么是前趋图?为什么要引入前趋图? 前趋图是一个有向无循环图,记为DAG,用于描述进程之间执行的先后关系。 2.试画出下面四条语句的前趋图: S1:axy; S2:bz1; S3:ca-b; S4:wc1; 3.为什么程序并发执行会产生间断性特征&…...
CAN通信----电路图
CAN通信----基本原理 一、CAN总线网络连接 1.闭环总线网络----ISO11898 闭环总线网络高速、短距离,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个120 欧的电阻。 2.开环总线网络----ISO11519 开环总线网络低速、…...
Windows系统安装ElasticSearch(一)
一 ES介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:分布式实时文件存储&#…...
linux 产生随机数 并遍历
1、产生随机数 varRANDOMvarRANDOM varRANDOMvar[ $var % 150 ] 2、产生不重复的随机数 $ entries($(shuf -i 0-149 -n 15)) $ echo “${entries[]}” 3、对随机数排序 $ entries($(shuf -i 0-149 -n 15 | sort -n)) $ echo “entries[]"12224549546678798393118119124140…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

