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.mzph.cn/news/678775.shtml

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

相关文章

Centos7安装nginx yum报错

Centos7安装nginx yum报错&#xff0c;yum源报错解决办法&#xff1a; 1、更新epel源后&#xff0c;出现yum报错 [roothacker117 ~]# yum install epel-release&#xff08;安装成功&#xff09; [roothacker117 ~]# yum install nginx&#xff08;安装失败&#xff0c;提示如…

深度学习之线性模型

深度学习之线性模型 y w * x模型思路 y w * x b模型思路 y w * x模型 思路 这里求权重w , 求最适合的权重&#xff0c;就是求损失值最小的时候 这里用穷举法:在一个范围内&#xff0c;列出w的所有值&#xff0c;并且计算出每组数据的平均损失值,以w 为横坐标, 损失值为纵坐…

Android 移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…

在没有鼠标或键盘的情况下在 Mac 上如何启用蓝牙?

通过这个技巧&#xff0c;小编将向您展示几种无需鼠标或键盘即可在 Mac 上重新启用蓝牙的方法。如果您想开始使用蓝牙配件&#xff0c;但还没有连接&#xff0c;这会很有用。 无需鼠标即可启用蓝牙 蓝牙是iPhone、iPad和 Mac 的标准配置。它确保您可以无线使用各种配件&#…

yolo层数连接

head [-1,6]连接的是第六层 [-1,4连接的是第四层

Leecode之合并两个有序链表

一.题目及剖析 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 二.思路引入 用指针遍历两个链表并实时比较,较小的元素进行尾差,然后较小元素的指针接着向后遍历 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int va…

深入Pandas:精通文本数据处理的20+技巧与应用实例【第68篇—python:文本数据处理】

文章目录 Pandas文本数据处理方法详解1. str/object类型转换2. 大小写转换3. 文本对齐4. 获取长度5. 出现次数6. 编码方向7. 字符串切片8. 字符串替换9. 字符串拆分10. 字符串连接11. 字符串匹配12. 去除空格13. 多条件过滤14. 字符串排序15. 字符串格式化16. 多列文本操作17. …

网络扫描神器:Nmap 保姆级教程(附链接)

一、介绍 Nmap&#xff08;Network Mapper&#xff09;是一款用于网络发现和安全审计的开源工具。它最初由 Gordon Lyon&#xff08;也被称为 Fyodor Vaskovich&#xff09;开发&#xff0c;是一款功能强大且广泛使用的网络扫描工具。Nmap 允许用户在网络上执行主机发现、端口…

uTools工具使用

之前发现一款非常有用的小工具&#xff0c;叫uTools&#xff0c;该软件集成了比如进制转换、json格式化、markdown、翻译、取色等等集插件大成&#xff0c;插件市场提供了很多开源插件工具。可以帮助开发人员节省了寻找各种处理工具的时间&#xff0c;非常推荐。 1、软件官方下…

【维生素C语言】附录:strlen 函数详解

写在前面&#xff1a;本篇将专门为 strlen 函数进行讲解&#xff0c;总结了模拟实现 strlen 函数的三种方法&#xff0c;并对其进行详细的解析。手写库函数是较为常见的面试题&#xff0c;希望通过本篇博客能够加深大家对 strlen 的理解。 0x00 strlen函数介绍 【百度百科】str…

vb.net极简版扫雷16*16,40雷源代码,仅供学习和参考

效果图&#xff1a;下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/14rrZujpQbfs-9HMw_lL-3Q?pwd1234 提取码&#xff1a;1234 源代码&#xff1a;只有120行 Imports System.Math Public Class Form1Dim Booms As New List(Of Point)Dim MyBooms As New List…

Activiti7(流程引擎)简单笔记,附带作者执行的Demo代码文件

文章目录 一、Activiti7流程基础1、最简单的流程2、流程值表达式3、方法表达式4、节点监听器5、流程变量6、候选人7、候选人组8、流程网关排他网关并行网关包容网关事件网关 二、Activiti7流程事件1、定时器事件定时器开始事件定时器中间事件定时器边界事件 2、消息事件消息开始…

【Java EE初阶十二】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…

多旋翼无人机飞行控制详解,四旋翼无人机飞控原理深入解析

在四旋翼无人机中&#xff0c;相邻的两个螺旋桨旋转方向是相反的。如图所示&#xff0c;三角形红箭头表示飞机的机头朝向&#xff0c;螺旋桨M1、M3的旋转方向为逆时针&#xff0c;螺旋桨M2、M4的旋转方向为顺时针。当飞行时&#xff0c;M2、M4所产生的逆时针反作用力&#xff0…

Java奠基】对象数组练习

目录 商品对象信息获取 商品对象信息输入 商品对象信息计算 商品对象信息统计 学生数据管理实现 商品对象信息获取 题目要求是这样的&#xff1a; 定义数组存储3个商品对象。 商品的属性&#xff1a;商品的id&#xff0c;名字&#xff0c;价格&#xff0c;库存。 创建三个…

双活工作关于nacos注册中心的数据迁移

最近在做一个双活的项目&#xff0c;在纠结一个注册中心是在双活机房都准备一个&#xff0c;那主机房的数据如果传过去呢&#xff0c;查了一些资料&#xff0c;最终在官网查到了一个NacosSync 的组件&#xff0c;主要用来做数据传输的&#xff0c;并且支持在线替换注册中心的&a…

学生学习知识点总结作文试题练习题考试资讯网站源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 学生学习知识点总结作文试题练习题考试资讯网站源码+WAP手机版+采集优化版-整站打包 整站打包源码,简洁大…

多模态(二)--- CoCa原理与源码解读

1 CoCa简介 CoCa代表Contrastive Captioner 的缩写&#xff0c;代表模型用两个目标函数训练出来的&#xff0c;一个是Contrastive Loss&#xff0c;一个是Captioning Loss。 2 CoCa训练流程 利用ViT对image进行encoder编码获得图像特征token对图像特征进行attention pooling…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇&#x1f600; &#xff08;祝广大IT学习者、工作者0 error 0 warning&#xff01;&#xff09; 一&#xff0c;DDL数据库操作 &#xff08;一&#xff09;库的查询操作 1.列出所有已定义数据库 show databases; 2.查询当前所处数据库 select database(); &…

基于Linux的HTTP代理服务器搭建与配置实战

在数字化世界中&#xff0c;HTTP代理服务器扮演着至关重要的角色&#xff0c;它们能够帮助我们管理网络请求、提高访问速度&#xff0c;甚至在某些情况下还能保护我们的隐私。而Linux系统&#xff0c;凭借其强大的功能和灵活性&#xff0c;成为了搭建HTTP代理服务器的理想选择。…