C++:继承的介绍和深度解析

一、继承的概念和定义

        1.什么是继承?

继承,顾名思义:就和现实生活中,孩子继承父母的东西有点类似。比如,你父亲的财产,你可以继承下来,你就可以使用父亲的钱。

官方一点的介绍:

继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序员在 持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称派生类。继承 呈现了面向对象 程序设计的层次结构 ,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用, 承是类设计层次的复用
2.继承的定义和格式
class 派生类的名字  :(冒号)  继承方式    基类的名字
{
//主体
};
下面是一个继承:apple类没有P()函数,但是它继承了Fruit,所以apple也相当于有了P()类的P()函数。所以使用apple类的对象,调用P()函数,打印出了Fruit;

2.继承类的继承方式和访问限定符

2.1有三种继承方式:

public继承,protected继承和private继承

他们的访问权限:

public>protected>private

2.2继承类访问基类成员的权限

巧记这个权限就是:小小取小,私有特例

基类和派生类的权限,谁的权限小,继承后就是那个权限。对于基类是private的,子类继承不了。

总结:

1.基类private成员无论以什么方式继承到派生类中都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2.基类private成员在派生类中不能被访问,如果基类成员不想在派生类外直接被访问,但需要在派生类中访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
3.基类的私有成员在子类都是不可见;基类的其他成员在子类的访问方式就是访问限定符和继承方式中权限更小的那个(权限排序:public>protected>private)。
4.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,但最好显式地写出继承方式。

二、基类和派生类

        1.基类和派生类对象赋值转换

class Fruit
{
public:void P(){cout << "Fruit" << endl;}
protected:string color;string name;
};class apple :public Fruit
{
public:protected:int size;string shape;
};

由上面报错行,我们可以看出。基类不能给派生类赋值。(父类不能给子类赋值)。但是子类可以给父类赋值。其实也有道理的。因为子类对父类进行扩展,拥有父类没有的成员。

而子类可以给父类赋值,也是同样的道理。父类有的子类继承了,所以子类给父类赋值时,是可以的。但是并不是将子类的全部成员都赋值过去,只将父类有的部分赋值过去。这种方法叫切割。

2.继承中的作用域

2.1基类和派生类都有自己的作用域

2.2如果父类和子类有相同的成员,那么子类使用是,只会调用自己的。会对继承父类的同名成员进行隐藏,也叫重定义。(也可以显式调用,使用::符号Fruit::_name)

2.3对于成员函数,只要名字一样就构成重定义

上面的apple类,他和Fruit类都有P()函数,当apple的对象调用时,他会调用自己的。对于Fruit类和apple类都有相同成员_name,子类中调用,可以通过Fruit::_name来调用父类的成员

3.派生类的默认成员函数

默认成员函数,我们不写,编译器也会默认生成。

1. 子 类的构造函数必须调用父类的构造函数初始化父类的那一部分成员。如果父类没有默认 的构造函数,则必须在子类构造函数的初始化列表阶段显示调用。(下左图)
2.派生类对象初始化先调用基类构造再调派生类构造。
3. 派生类对象析构清理先调用派生类析构再调基类的析构。(下右图)
4.派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。下图

 5.派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。见下图

class Fruit
{
public:Fruit(const string name,const string color) :_name(name),_color(color){ cout << "Fruit()" << endl; }Fruit(const Fruit& F){cout << "const Fruit& F" << endl;}~Fruit(){cout << "~Fruit()" << endl;}
protected:string _color;string _name ;
};
class apple :public Fruit
{
public:apple(const string name, const string size,const string color):Fruit(name,color), _size(size){cout << "apple()" << endl;}apple (const apple& a) :Fruit(a),_size(a._size){cout << "const apple& a" << endl;}~apple() { cout << "~apple()" << endl; }protected:string _size ;};
void test()
{apple a("apple", "red", "big");apple a2("apple","yellow", "big");apple p(a);}

6.赋值运算符重载,必须用父类的运算符重载来完成

 4.继承的其他一些关系

1.友元关系不能继承 ,也就是说基类友元不能访问子类私有和保护成员
2. 基类定义了 static 静态成员,则整个继承体系里面只有一个这样的成员 。无论派生出多少个子 类,都只有一个 static 成员实例

三、单继承和多继承

        1.单继承

2.多继承

3.菱形继承 

下面这个情况也构成菱形继承,并不是严格的菱形才算。

 

原因:因为B和C都继承了A的_a  ,当D继承B和C后,里面的_a不知道用B继承的_a还是用C继承的_a.,尽量不要使用菱形继承,很麻烦

4.解决方法

4.1加前置声明

4.2使用虚继承

关于虚继承是什么,当你学了多态就知道了。可以在我后续的文章看到。

virtual是定义C++中虚函数的关键字 。在面向对象程序设计领域,C++、Object Pascal 等语言中有虚函数(英语:virtual function)或虚方法(英语:virtual method)的概念。这种函数或方法可以被子类继承和覆盖,通常使用动态调度实现。这一概念是面向对象程序设计中(运行时)多态的重要组成部分。简言之,虚函数可以给出目标函数的定义,但该目标的具体指向在编译期可能无法确定。

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

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

相关文章

JUC/多线程 模式(四)

一、同步模式之保护性暂停 即 Guarded Suspension &#xff0c;用在一个线程等待另一个线程的执行结果 产生结果的线程和使用结果的线程是一一对应的&#xff0c;有多少个生产结果的线程就有多少个使用结果的线程。 要点 有一个结果需要从一个线程传递到另一个线程&#xff0…

JUC/多线程原理(三)

一、Monitor 原理 二、synchronized 原理 (一)、基础 synchronized 即使内部抛出异常也会释放锁 (二)、轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&#xff0c;但加锁的时间是错开的&#xff08;也就是 没有竞争 &#xff09;&#xff0c;那么…

java分割回文串(力扣Leetcode131)

分割回文串 力扣原题链接 问题描述 给定一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s 所有可能的分割方案。 示例 示例 1: 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输…

【御控物联】 IOT异构数据JSON转化(场景案例一)

文章目录 前言技术资料 前言 随着物联网、大数据、智能制造技术的不断发展&#xff0c;越来越多的企业正在进行工厂的智能化转型升级。转型升级第一步往往是设备的智能化改造&#xff0c;助力设备数据快速上云&#xff0c;实现设备数据共享和场景互联。然而&#xff0c;在生产…

爬虫逆向实战(38)-某空气质量平台(反调试,AES,DES,MD5)

一、数据接口分析 主页地址&#xff1a;某空气质量平台 1、抓包 (1) 反调试 该网站对鼠标右击以及F12进行了监听并拦截 虽然该网站无法打开Chrome控制台&#xff0c;导致我们无法抓包&#xff0c;但是道高一尺魔高一丈。既然我们无法在打开该网站的时候打开Chrome控制台&…

高架学习笔记之UML图概要

目录 零、什么是UML图 一、类图 二、对象图 三、构件图 四、部署图 五、制品图 六、包图 七、组合结构图 八、用例图 九、序列图 十、通信图 十一、状态图 十二、活动图 十三、定时图 十四、交互概览图 零、什么是UML图 统一建模语言&#xff08;Unified Modeli…

pytorch中的torch.hub.load():以vggish为例

pytorch提供了torch.hub.load()函数加载模型&#xff0c;该方法可以从网上直接下载模型或是从本地加载模型。官方文档 torch.hub.load(repo_or_dir, model, *args, sourcegithub, trust_repoNone, force_reloadFalse, verboseTrue, skip_validationFalse, **kwargs)参数说明&a…

【Qt】:坐标

坐标 一.常用快捷键二.使用帮助文档三.Qt坐标体系1.理论2.代码 一.常用快捷键 注释&#xff1a;ctrl / • 运⾏&#xff1a;ctrl R • 编译&#xff1a;ctrl B • 字体缩放&#xff1a;ctrl ⿏标滑轮 • 查找&#xff1a;ctrl F • 整⾏移动&#xff1a;ctrl shift ⬆/…

protobuf学习笔记(二):结合grpc生成客户端和服务端

上一篇文章大概讲了如何将自定义的protobuf类型的message转换成相应的go文件&#xff0c;这次就结合grpc写一个比较认真的客户端和服务器端例子 一、项目结构 client存放rpc服务的客户端文件 server存放rpc服务的服务端文件 protobuf存放自定义的proto文件 grpc存放生成的g…

代码随想录训练营Day36:● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

435. 无重叠区间 题目链接 https://leetcode.cn/problems/non-overlapping-intervals/description/ 题目描述 思路 直接统计重叠区间的个数&#xff0c;就是需要删除的个数 public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,b)-> Intege…

【电子取证篇】哈希校验值的变与不变

【电子取证篇】哈希校验值的变与不变 哈希值&#xff08;散列值&#xff09;是针对电子数据内容来计算的&#xff0c;内容变则哈希变&#xff1b;但计算对象的文件名、文件时间等属性改变不会影响散列值&#xff01;&#xff01;&#xff01;—【蘇小沐】 &#xff08;一&…

点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

Nginx转发代理请求(http)+转发mysql(stream)

1.Nginx能处理的不同类型模块 1.1 http 模块 http 模块用于处理 HTTP 和 HTTPS 协议的请求和响应&#xff0c;通常用于构建 Web 服务器和反向代理服务器。通过 http 模块配置的服务可以处理 Web 浏览器发起的 HTTP 请求&#xff0c;并向客户端提供 Web 页面、静态资源、API 接…

linux通用命令 ssh命令连接慢问题排查

系列文章目录 文章目录 系列文章目录一、 ssh 连接慢3.1 查找原因3.2 解决方案 一、 ssh 连接慢 最近的 koji 服务器 使用 ssh 连接很慢。 3.1 查找原因 可以通过 ssh -vvv 192.168.0.123 或 time ssh root192.168.0.123 exit 查找原因如下&#xff1a; SERVER的SSHD会去DN…

【论文通读】UFO:A UI-Focused Agent for Windows OS Interaction

UFO&#xff1a;A UI-Focused Agent for Windows OS Interaction 前言AbstractMotivationMethodsExperimentConclusion 前言 Windows客户端第一个JARVIS&#xff0c;利用GPT4 Vision识别截图信息辅助智能体自动化执行操作&#xff0c;作为微软大肆宣传的一篇工作&#xff0c;其…

什么是齐纳二极管?齐纳二极管1SMB5944BT3G参数详解+应用方案

关于齐纳二极管基本知识&#xff1a; 齐纳二极管&#xff0c;又称稳压二极管。利用PN结的反向击穿状态&#xff0c;电流变化范围大&#xff0c;电压基本不变。制作了具有稳压功能的二极管。这种二极管是一个高电阻半导体器件&#xff0c;直到临界反向击穿电压。在这个临界击穿…

如何将Maven与TestNG集成

我们已经讨论了如何在maven中执行单元测试用例&#xff0c;但那些是JUnit测试用例&#xff0c;而不是TestNG。当maven使用“mvn test”命令进入测试阶段时&#xff0c;这些用例被执行。 本文将介绍如何将Maven与TestNG集成&#xff0c;并在maven进入测试阶段时执行TestNG测试。…

创新研报 | 2024+人工智能安全报告

人工智能(AI)是新一轮科技革命和产业变革的核心技术&#xff0c;被誉为下一个生产力前沿。具有巨大潜力的 AI 技术同时也带来两大主要挑战:一个是放大现有威胁&#xff0c;另一个是引入新型威胁。 奇安信预计&#xff0c;未来十年&#xff0c;人工智能技术的恶意使用将快速增长…

【数据结构】树tree

树的遍历 广度遍历Breadth-first traversal Breadth-first traversal is the traversal strategy used in the binary tree.Breadth first traversal, also known as level order traversal is the traversal strategy used in a binary tree. It involves visiting all the …

每日一题(leetcode2909):单份查找与群组查找

如果按照简单的方式&#xff0c;逐个查找中间元素&#xff08;往两边扩散&#xff09;&#xff0c;那么复杂度会是n方。 这种方式没有对比较大小后的数据进行充分利用&#xff0c;所以复杂度较高。 我们考虑到既然要遍历&#xff0c;那么不妨干脆先把所有元素的左边最小值和右…