【C++打怪之路Lv13】- “继承“篇

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

继承本质意义是复用

继承的概念及定义

概念

继承定义 

格式

继承基类成员访问方式的变化

表格法(谁小谁做主)

总结 

1)谁的权限小(派生类)听谁的 

2)

3)

4)实际中一般用public继承

代码

基类和派生类对象赋值(兼容)转换

概念

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

2、基类对象不能赋值给派生类对象

原因

继承的作用域

规则

概念

1.隐藏/重定义

2.在实际中在继承体系里面最好不要定义同名的成员

派生类的默认成员函数 

1)派生类的构造函数

①派生类对象的初始化顺序

2)派生类的拷贝构造函数

3)派生类的赋值运算符

4)派生类的析构函数

①顺序

②析构函数重写

 继承与友元

 继承与静态成员

复杂的菱形继承及菱形虚拟继承 

继承与组合 

面试题

1、

2、

3、


继承本质意义是复用

继承的概念及定义

概念

什么是继承?

继承是面向对象程序设计中实现代码复用的关键机制,它允许程序员在保留基类特性的同时,创建具有额外功能的新类,即派生类。

这种机制展现了对象层次结构,并映射了从简单到复杂的认知发展过程。与传统的函数复用不同,继承实现了类级别的复用。
(简单来说就是儿子继承父业:儿子在父业的基础上开拓新的东西或装饰)


继承定义 

格式


继承基类成员访问方式的变化

表格法(谁小谁做主)

总结 

1)谁的权限小(派生类)听谁的 

照public列来说:

①对应行基类的public成员:public小,听public的,派生类是public

②对应行基类的protected成员:protected小,听protected的,派生类是protected

③对应行基类的private成员:private小,听private的,派生类不可见

2)

①被其所属类的成员函数访问
②被类的对象直接访问
③被派生类的(成员/函数)访问

在私有限定符下:①

保护限定符下:①③

3)

struct默认继承方式是public

class默认继承方式是private

4)实际中一般用public继承


代码

这是在父类的成员函数、成员变量处于public(公有)下

如果成员变量不是处于public下呢,我们该怎么修改对象的其中一个成员变量?

 答案是在公有public设置成员函数



基类和派生类对象赋值(兼容)转换

简称:切割/切片

概念

区别于:类型转换,中间会产生临时变量(隐式变量是常量加const)

(C语言的截断和提升:int型->(赋值)char, 然后char->int)

简单来说:

 派生类到基类的赋值兼容性允许派生类对象被赋值给基类对象,而无需显式类型转换。这种赋值过程不涉及临时变量。

与类型转换不同,派生类到基类的赋值是一种切片操作,仅保留基类部分。

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


2、基类对象不能赋值给派生类对象

简单理解:不能把小的变成大的

原因



继承的作用域

规则

局部域、全局域、命名空间域、类域:
1.会影响语言编译查找规则;
怎么找?:先到局部找,再到全局找
2.局部域和全局域会影响生命周期


概念

1.隐藏/重定义

隐藏发生在派生类中,当派生类定义了与基类同名的成员函数或成员变量时基类中的同名成员在派生类的作用域内被隐藏

隐藏与重载不同,重载要求函数在同一个作用域内具有不同的参数列表

简单来说:

(隐藏:函数名相同;
区别于重载:重载前提要求在同一个作用域)

派生类中和基类有同名函数/同名变量


2.在实际中在继承体系里面最好不要定义同名的成员

如要确实使用/访问同名的,使用作用域解析运算符来明确指出你想要访问的是哪个类的成员(指定/显示)

class Base
{
public:void Print(){cout << "Base_Print()" << endl;}
}; class Derived : public Base
{
public:// 定义一个与基类同名的成员函数 void Print(){cout << "Derived_Print()" << endl;}// 使用作用域解析运算符调用基类的成员函数void Base_Print(){Base::Print();} 
};int main()
{	Derived d;d.Print();// 下面↓↓↓两个等价 // 使用作用域解析运算符调用基类中的Print函数d.Base_Print();// 直接使用作用域解析运算符调用基类中的Print函数d.Base::Print();return 0;
}

派生类的默认成员函数 

1)派生类的构造函数

①派生类对象的初始化顺序

基类构造函数先于派生类构造函数执行(先有基类[地基]再有派生类[建筑高层])

C++遵循顺序:按声明的顺序走
(必须先父后子,因为子类构造初始化可能会用父类成员;没有初始化父,父类成员就是随机值)
父类构造可以显示写,可以保证先父后子

子类默认生成的构造
父类成员(整体)    --    默认构造
子类自己的内置成员 -- 一般不处理
子类自己的自定义成员 -- 默认构造


2)派生类的拷贝构造函数

(一般情况下不需要写浅拷贝)

派生类拷贝构造函数负责正确复制基类部分和派生类新增成员

子类默认生成的拷贝构造
父类成员(整体)    -- 调用父类的拷贝构造
子类自己的内置成员 -- 值拷贝
子类自己的自定义成员 -- 调用他的拷贝构造
一般就不需要自己写了,子类成员涉及深拷贝,就必须自己实现


3)派生类的赋值运算符

(赋值重载跟拷贝构造相似)

 派生类赋值运算符负责正确赋值基类部分和派生类新增成员


4)派生类的析构函数

①顺序

派生类析构函数先于基类析构函数执行【先有派生类的析构函数(毁掉高层)再有基类的析构函数(毁掉地基)

父类析构不能显示调用,因为显式调用不能保证先子后父

子类默认生成的析构
父类成员(整体) -- 调用父类的析构
子类自己的内置成员 -- 不处理
子类自己的自定义成员 -- 调用析构

不能先父后子原因:

因为子类析构时可能会用到父类成员的;先父后子,就可能会出问题
父类析构不是自己显示调用的,子类析构结束时自动调用的

②析构函数重写

派生类析构函数隐式调用基类析构函数

如果基类的析构函数不是虚函数派生类的析构函数会隐藏基类的析构函数,而不是重写它。

 



 继承与友元

友元关系不能继承
(基类友元不能访问子类私有成员和保护成员)
简单来说:爸爸的朋友不是我的朋友
关键词:friend

 



 继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员
简单来说:基类加了static修饰,该成员为为相同地址
关键词:static

class Base
{
public:static int static_val;
};// 初始化基类的静态成员
int Base::static_val = 10;class Derived : public Base
{};int main()
{cout << "Base::static_val:" << Base::static_val << endl;cout << "Derived::static_val:" << Derived::static_val << endl;// 修改基类的val值 Base::static_val = 30; // 打印派生类的val值 cout << "Derived::static_val:" << Derived::static_val << endl;return 0;
}


复杂的菱形继承及菱形虚拟继承 



继承与组合 



面试题

1、

①什么是菱形继承?

菱形继承是指一个类同时继承自两个或多个类,而这些父类又共同继承自一个共同的祖先类,形成一个菱形结构
②菱形继承的问题是什么?

  • 数据冗余:共同祖先类的成员在派生类中存在多份副本。
  • 二义性:如果共同祖先类中有成员在派生类中被重新定义,那么在访问该成员时可能会产生二义性。

2、

①什么是菱形虚拟继承?

菱形虚拟继承是指在菱形继承结构中,共同祖先类通过虚拟继承的方式被继承,以确保在派生类中只存在一份共同祖先类的成员
②如何解决数据冗余和二义性的

虚拟继承:通过在继承声明中使用关键字 virtual,确保共同祖先类的成员在派生类中只被实例化一次,从而解决数据冗余和二义性问题

3、

①继承和组合的区别?

  • 继承:是一种 “is-a” 关系,派生类是基类的一种特化。
  • 组合:是一种 “has-a” 关系,一个类包含另一个类的对象作为其成员

②什么时候用继承?

继用时:

  • 当派生类需要扩展或特化基类的行为时。
  • 当派生类和基类之间存在明确的 “is-a” 关系时

③什么时候用组合?

 组合时:

  • 当类需要使用另一个类的功能,但不需要继承其接口时。
  • 当需要复用代码,但又不希望引入继承带来的强耦合关系时


***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“跟随怎样的圈子,塑造怎样的自己。”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

【科研积累】大模型的认知笔记

1 认识大模型 大模型是人工智能发展的一个里程碑&#xff0c;人工智能包括机器学习&#xff0c;机器学习包括监督学习、无监督学习和强化学习&#xff0c;深度学习神经网络也是机器学习的一个分支&#xff0c;生成式人工智能是深度学习的一个子集&#xff0c;ChatGPT和Stable …

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量&#xff08;我的是在~/.bash.profile&#xff09; export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

自动驾驶系列—自动驾驶中的短距离感知:超声波雷达的核心技术与场景应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

体育活动赛事报名马拉松微信小程序开发

功能描述 体育活动赛事报名马拉松微信小程序&#xff0c;该项目是一个体育活动报名小程序&#xff0c;主要功能有活动报名、扫码签到、签到积分、排行奖励、积分兑换等功能。 用户端&#x1f536;登录&#xff1a;◻️1.微信授权登录 ◻️2.手机号码授权 &#x1f536;首页&am…

uniapp框架配置项pages.json

uniapp框架配置项pages.json pages.json 文件用来对 uni-app 进行全局配置&#xff0c;决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 globalStyle 全局配置 用于设置应用的状态栏、导航条、标题、窗口背景色等。下面配置项默认应用于每个页面。 注意…

Android关机流程知多少?

在 Android 中&#xff0c;关机流程涉及系统各个组件的协同工作&#xff0c;确保设备在断电之前能够安全地关闭所有活动并保存数据。以下是 Android 系统中关机流程的详细介绍&#xff1a; 1. 用户触发关机请求 关机流程由用户的操作触发&#xff0c;通常有以下几种方式&#…

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子&#xff0c;展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1&#xff0c;准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具&#xff0c;已经深度融入我们的工作和生活。随着物联网技术的快速发展&#xff0c;以及人们对PC性能要求的逐步提高&#xff0c;AI PC成为了行业发展的重要趋势。 11月7-8日&#xff0c;骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

SCUI Admin + Laravel 整合

基于 Vue3 和 Element Plus 和 Laravel 整合开发 项目地址&#xff1a;持续更新 LaravelVueProject: laravel vue3 scui

Docker的轻量级可视化工具Portainer

docker目录 1 Portainer官方链接2 是什么&#xff1f;3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接&#xff1a;https://www.portainer.io/ portainer安装的官方链接&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/l…

Sql server 备份还原方法

备份 方法1&#xff0c;选择对应的数据库名-------》右键 任务---------》备份 默认备份类型 完整 文件后缀 .bak 方法2,选择对应的数据库名-------》右键 任务----------》生成脚本 选择要编写的数据库对象(表&#xff0c;视图&#xff0c;存储过程等) 选择对应的 服…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…

可编辑PPT | 指挥中心系统建设与应用方案

本方案是一份全面的指挥中心系统建设与应用方案&#xff0c;涵盖了建设方案分析、指挥调度、远程通讯、会务管理等多个方面&#xff0c;旨在通过整合语音、视频监控、会议、指挥调度等多种技术&#xff0c;构建一个现代化、网络化、智慧化的城市指挥中心&#xff0c;以提高应对…

【CentOS】中的Firewalld:全面介绍与实战应用(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、iptables 时代 2、firewalld 时代 二、服务管…

人工智能在智能家居中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 人工智能在智能家居中的应用 人工智能在智能家居中的应用 人工智能在智能家居中的应用 引言 人工智能概述 定义与原理 发展历程 …

qt QWidgetAction详解

1、概述 QWidgetAction是Qt框架中的一个类&#xff0c;它继承自QAction类。QWidgetAction允许开发者将自定义的小部件&#xff08;widget&#xff09;插入到基于QAction的容器中&#xff0c;如工具栏或菜单项中。这使得QWidgetAction成为创建复杂用户界面和自定义菜单项的强大…

一文了解什么是腾讯云开发

一文了解什么是腾讯云开发 关于云开发的猜想腾讯云开发腾讯云开发的优势无服务跨平台轻松托管节约成本 快速上手云开发环境快速搭建管理后台 云开发体验 关于云开发的猜想 说到云开发&#xff0c;作为开发者的大家是否大概就有了想法。比如说过去的开发工作都是在自己本地电脑…

2.操作系统常问面试题1

2.1 Linux 中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数是什么 1、查看进程运行状态的指令&#xff1a; ps aux 列出所有进程的详细信息。 ps aux | grep PID &#xff0c;查看具体某PID进程状态。 在 Linux 中&#xff0c;可以使用以下指令来查看进…

LED和QLED的区别

文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示&#xff08;LCD&#xff09;技术的电视类型&#xff0c;但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别&#xff…

多路转接之poll

多路转接之poll 一、关于poll认识poll基于poll实现的服务器的原理 二、基于poll实现的服务器main.cpppollServer.hppsock.hppLog.hpppublic.hpp 一、关于poll 认识poll #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd {int …