C++对象继承

news2024/11/16 8:48:09

继承概念:

首先引入一个生活例子,普通人是一个类对象,学生是一个类对象,普通人拥有的属性学生一定会有,学生拥有的属性普通人不一定有。类比一下,把普通人抽象为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.coloradmin.cn/o/1444067.html

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

相关文章

多视图特征学习 Multi-view Feature Learning既可以被看作是一种学习框架,也可以被看作是一种具体的学习算法!

Multi-view Feature Learning 1.多视图特征学习Multi-view Feature Learning的基本介绍总结 1.多视图特征学习Multi-view Feature Learning的基本介绍 多视图特征学习是一种利用多视图数据集来进行联合学习的机器学习方法。多视图数据指的是对同一事物从多种不同的途径或角度进…

Python : 使用python实现学生管理系统的功能,详细注释

一、学生管理系统 学生描述&#xff1a;姓名、年龄、成绩 学生管理系统功能&#xff1a;添加学生信息、删除学生信息、根据姓名修改学生信息、根据姓名查询学生信息、显示所有学生信息、退出系统 二、代码说明 1. 将每一个学生的信息放一个元组中&#xff0c;再把元组添加到列表…

LeetCode 144 二叉树的前序遍历

大家新年快乐&#xff0c;long年大吉 今天的题很简单&#xff0c;前序用栈就行。 电脑没拿&#xff0c;用我妈的pad艰难敲代码&#xff0c;敲字 知识点随便写点吧&#xff0c;这里基础点挺多&#xff0c;以后补充下 栈&#xff1a;先进后出&#xff0c;数据结构用stack&…

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…

C语言笔试题之实现C库函数 pow()(递归的思想)

实例要求&#xff1a; 1、请你实现C库函数 pow()&#xff08;stdio.h & math.h&#xff09; &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即x^n &#xff09;&#xff1b;2、函数声明&#xff1a;double myPow(double x, int n)&#xff1b;参数&#xff1a;1、x …

城市合伙人计划:资源共享、知识交流、合作创新

城市合伙人计划是一种合作伙伴关系&#xff0c;旨在通过共享资源、知识和经验&#xff0c;共同推动城市的经济发展和社会进步。这种计划通常涉及市政府、企业、社会组织和个人等多个方面&#xff0c;通过合作共同解决城市面临的问题和挑战。 城市合伙人计划的具体形式和内容可…

【java】Hibernate访问数据库

一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射&#xff08;ORM&#xff09;工具。它简化了 Java 应用程序中数据库操作的复杂性&#xff0c;并提供了一个框架&#xff0c;用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…

洛谷p4391 无限传输

考察字符串周期的题 题目链接 结论 要求字串 s s s的最短循环字串长就是&#xff1a; a n s n − p m t [ n ] ansn-pmt[n] ansn−pmt[n] 证明如下&#xff1a; 这是最大的前缀和后缀 现在我们做如下操作&#xff1a; 补全字段 a a a和字段 b b b&#xff0c;按子段 a a a的…

阿里(淘天)一面笔试算法原题

阿里撤资 "车来了" 近日&#xff0c;国内实时公交产品"车来了"关联公司武汉元光科技有限公司发生工商变更&#xff0c;阿里巴巴&#xff08;中国&#xff09;网络技术有限公司退出股东行列。 这很好理解&#xff0c;符合近期阿里收缩战线的行为一致性。 毕…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;一个Vue实例从 创建…

【新书推荐】7.4节 寄存器间接和相对寻址方式

本节内容&#xff1a;当指令操作数为内存操作数&#xff0c;且内存操作数的地址使用指针寄存器表示时&#xff0c;称为寄存器间接寻址方式。 ■寄存器间接寻址方式&#xff1a;在地址表达式中&#xff0c;只能使用BX、SI、DI、BP四个指针寄存器用来寻址。 7.4.1 寄存器间接寻…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息维护模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果&#xff0c;视频制作者可能会采用动态水印的方式&#xff0c;让其他人难以盗取视频使用。动态水印的添加&#xff0c;需要应用到运动路径功能。接下来&#xff0c;本文会教大家动态水印怎么加&#xff0c;怎么去除动态水印的相关内容。感兴趣的小…

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

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

一招搞定!Windows 右键秒建 Markdown 文件

创建Markdown文件&#xff08;拓展名为.md&#xff09;在Windows 10操作系统中并非内置功能。以下是一篇博客教程&#xff0c;指导用户如何实现在Windows 10中通过右键菜单新建Markdown文件的过程。 如何在Windows 10中通过右键菜单新建Markdown文件 Markdown是一种轻量级标记…

C#,欧拉常数(Euler Constant)的算法与源代码

1 欧拉常数 欧拉常数最先由瑞士数学家莱昂哈德 欧拉 (Leonhard Euler) 在1735年发表的文章《De Progressionibus harmonicus observationes》中定义。欧拉曾经使用γ作为它的符号&#xff0c;并计算出了它的前6位&#xff0c;1761年他又将该值计算到了16位 。 欧拉常数最先由瑞…

Open CASCADE学习|环形弹簧建模

目录 Draw Test Harness&#xff1a; C&#xff1a; 环形弹簧&#xff0c;也称为弓簧&#xff0c;是由拉伸弹簧和连接弹簧构成的。在结构上&#xff0c;环形弹簧通常包括端环、外环和内环&#xff0c;其主要参数包括弹簧的内径、外径和自由高度。环形弹簧的一个显著特点是&am…

MySQL篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、NULL 是什么意思二、主键、外键和索引的区别?三、你可以用什么来确保表格里的字段只接受特定范围里的值?四、说说对 SQL 语句优化有哪些方法?(选择几条)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

ECMAScript Modules规范的示例详解

ECMAScript Modules&#xff08;ESM&#xff09;是JavaScript中用于模块化开发的规范&#xff0c;它允许开发者将代码分割成多个独立的文件&#xff0c;以提高代码的可维护性和可重用性。下面是一个ECMAScript Modules规范的示例详解&#xff1a; 创建模块 1.1 导出变量 在一个…

低代码开发的数字化革新:实业界的成功秘诀与实践之路

在信息时代&#xff0c;实业界正迎来一场变革的风暴&#xff0c;传统的管理系统逐渐不再满足越来越复杂的生产流程和不断增长的市场需求&#xff0c;而低代码开发正如一颗璀璨的明星&#xff0c;将为企业带来前所未有的灵活性和创新力&#xff0c;这并非一场技术的简单变迁&…