C++对象继承

继承概念:

首先引入一个生活例子,普通人是一个类对象,学生是一个类对象,普通人拥有的属性学生一定会有,学生拥有的属性普通人不一定有。类比一下,把普通人抽象为A对象,学生抽象为B对象,A对象的成员B对象均有。
于是在定义类的时候,我们并不希望在AB中输入两次重复的代码,更希望通过一种简便的方式快速植入共同成员,这种方法就叫做继承

class A{};
class B : public A{};

上面的写法表示B是A的公有继承
A我们称之为基类,B称之为派生类

继承方式:

继承分为公有继承、保护继承、私有继承三类,其中最常用的是公有继承,它们的关键字与访问限定符一致,分别是public、protect、private。

不同的继承方式所对应的结果见下图👇:
在这里插入图片描述

注:在派生类中不可见不代表派生类不继承基类的private成员,而是在派生类中无法直接访问这些成员

友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员

整个继承体系里面只有一个static成员

赋值转换:

class A{
protected:int _a = 1;
};class B : public A{
protected:int _b = 1;
};B obj;A& ref = obj;	//①
A* ptr = &obj;	//②

上面的代码会编译出错吗?
答案是不会,很奇怪,按理来说命名A B是两个类型,为什么就可以初始化A&和A*类型呢?

这里涉及到一个类似 切片 的过程,编译器会自动把ref和ptr指向B中基类所拥有的成员,而忽略B中独有的成员。
在这里插入图片描述
(vs2019监视现象)

这里并不会涉及到隐式类型转化,原因就在于我们上述代码没有报错,加入有隐式类型转化,那么必然会生成具有常性的临时变量,会造成权限放大的错误。

成员隐藏:

class A{
protected:int _num=1;
};
class B : public A{
public:void print(){cout<<_num<<endl;}
};

很简单的一段代码,甚至可以猜到输出内容是1,B继承了A中的_num,
但是如果我们在B中也设置一个成员变量,也叫_num(缺省值设置为2),
那么输出结果又是什么?
结果是2

可以解释为编译器自动地把这一块部分识别成当前类域的变量,这种现象我们就叫做成员构成隐藏,如果想要使得打印结果成为1,需要加上访问限定符,cout<<A::_num<<endl;

成员函数的隐藏与此同理,特别需要区分隐藏和函数重载的不同,隐藏是不同作用域下的(只需要函数名相同就构成隐藏),而重载的作用域必须相同

默认成员函数:

派生类在实例化的时候会先调用基类中的默认成员函数来处理共同部分,而后在处理独有部分
在这里插入图片描述
以构造函数为例子:

class A{
public:A(int x):_num1(x){}
protected:int _num1;
};
class B : public A{
public:B(int x,int y):A(x),_num2(y){}
protected:int _num2;
};

菱形继承:

C++的缺陷之一:多继承引发的菱形继承

菱形继承最大的问题就是数据冗余和二义性问题,很容易导致编译出错。
实际工作或学习中我们应该避免多继承,避免菱形继承。

为了解决菱形继承引发的一系列问题,C++引入了虚拟继承,由于菱形继承实用性非常非常底下,不做过多介绍。

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

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

相关文章

Easy Excel动态表头的实现

步骤&#xff1a; 1.查找官方API文档理解实现 2.实现融入到代码里面 一&#xff1a;Easy Excel动态头实时生成头写入 动态头实时生成头写入 二&#xff1a;实现 目的&#xff1a;实现表头为&#xff0c;第一列是固定列&#xff0c;第二列为动态生成的时间段的每一天的日期…

2024年【上海市安全员C3证】考试及上海市安全员C3证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【上海市安全员C3证】考试及上海市安全员C3证新版试题&#xff0c;包含上海市安全员C3证考试答案和解析及上海市安全员C3证新版试题练习。安全生产模拟考试一点通结合国家上海市安全员C3证考试最新大纲及上海市…

3D立方体图册

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D立方体图册</title><style>* {pad…

在 Windows上恢复删除照片的 4 种有效方法

您是否曾在 Windows 7/8/10/11 中不小心删除过照片&#xff1f;如何轻松快速地恢复已删除的照片&#xff1f;在这里这篇文章列出了几种在Windows 11/10/8/7中恢复已删除照片的可行方法&#xff0c;而MiniTool数据恢复软件 是丢失照片恢复的最佳选择。 意外删除的照片 根据一项…

Scrum敏捷开发管理全流程-敏捷管理工具

Leangoo领歌是款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新。…

力扣 第 383 场周赛 解题报告 | KMP

力扣 第 383 场周赛 解题报告 | KMP 链接 前言 一个人能走的多远不在于他在顺境时能走的多快&#xff0c;而在于他在逆境时多久能找到曾经的自己。 T1 修改矩阵 思路&#xff1a;模拟 时间复杂度&#xff1a; O ( m n ) O(mn) O(mn) class Solution:def modifiedMatrix(se…

【数学建模】【2024年】【第40届】【MCM/ICM】【E题 财产保险的可持续性】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem E: Sustainability of Property Insurance Extreme-weather events are becoming a crisis for property owners and insurers. The world has endured “more than $1 trillion in damages from more than …

LeetCode Python - 6.Z字形变换

文章目录 题目答案运行结果 题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输…

假期day5

TCP UDP区别 共同点&#xff1a;都是属于传输层的协议 TCP&#xff1a;稳定。面向连接的&#xff0c;有可靠的数据传输服务。传输过程中数据无误&#xff0c;无丢失&#xff0c;无失序&#xff0c;无重复。传输效率低&#xff0c;耗费资源多。数据收发不同步&#xff0c;有沾…

大模型训练所需的硬件配置

1. 引入 训练一个大模型&#xff0c;到底需要投入多少块GPU&#xff0c;需要多少数据&#xff0c;训练多长时间能达到一个不错的效果&#xff1f; 本文引用靠谱的数据&#xff0c;来回答这些问题。 2. 全流程训练 大模型的训练&#xff0c;简单来说&#xff0c;分为Pretrain…

【EAI 017】Interactive Language: Talking to Robots in Real Time

论文标题&#xff1a;Interactive Language: Talking to Robots in Real Time 论文作者&#xff1a;Corey Lynch, Ayzaan Wahid, Jonathan Tompson Tianli Ding, James Betker, Robert Baruch, Travis Armstrong, Pete Florence 作者单位&#xff1a;Robotics at Google 论文原…

LeetCode.144. 二叉树的前序遍历

题目 144. 二叉树的前序遍历 分析 这道题目是比较基础的题目&#xff0c;我们首先要知道二叉树的前序遍历是什么&#xff1f; 就是【根 左 右】 的顺序&#xff0c;然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现…