C++从零开始的打怪升级之路(day42)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于继承的知识点

1.菱形继承

我们有许多关于继承的方式

1.单继承

一个子类只有一个直接父类称这个继承关系为单继承

class A
{
public:int _a;
};class B : public A
{
public:int _b;
};class C : public B
{
public:int _c;
};

2.多继承

一个子类有两个或以上直接父类时称这个继承关系为多继承

class A
{
public:int _a;
};class B
{
public:int _b;
};class C : public A, public B
{
public:int _c;
};

3.菱形继承

菱形继承是多继承的一种特殊情况

class A
{
public:int _a;
};class B : public A
{
public:int _b;
};class C : public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

菱形继承的问题:菱形继承有数据冗余和二义性的问题,如上面的D对象中会出现两份_a成员

2.菱形虚拟继承

引出了菱形继承的问题,我们必然有解决的办法,下面介绍办法及菱形虚拟继承

class A
{
public:int _a;
};class B : virtual public A
{
public:int _b;
};class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

上面就是一种最简单的菱形虚拟继承的模型

虚拟继承可以解决菱形继承的二义性和数据冗余的问题,如上面的继承关系,在B,C继承A的时候使用虚拟继承即可,需要注意的是,虚拟继承不要在其他的地方去使用

3.虚拟继承解决数据冗余和二义性的原理

class A
{
public:int _a;
};class B : virtual public A
{
public:int _b;
};class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

我们再次借助这个模型来了解虚拟继承的原理

在vs环境下进入调试,内存窗口中我们可以发现,_a在对象内存的最下面,属于B,C公共的成员,

那么如果我们将D切割给B(C),此时B(C)如何找到A呢?

这里是通过了B和C内的两个指针,指向的一张表,这两个指针叫做虚基表指针,虚基表中存的是偏移量,通过偏移量可以找到下面的A

4.继承的总结与反思

1.C++语法复杂,多继承就是一个体现,有了多继承,就存在菱形继承,因而有菱形虚拟继承,底层实现就很复杂

2.多继承可以认为是C++的一种缺陷,Java就没有多继承

3.继承和组合

继承是一种is_a的关系,也就是说每一个派生类对象都是一个基类对象

组合是一种has_a的关系,假如B组合了A,每个B对象中都有一个A对象

实际中,优先使用对象组合,而不是类继承(组合的耦合度低,代码维护好)

当然有些情况更适用于使用继承,那么使用继承也无可厚非

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!

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

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

相关文章

【软件测试】Postman中变量的使用

Postman中可设置的变量类型有全局变量,环境变量,集合变量,数据变量及局部变量。区别则是各变量作用域不同,全局变量适用于所有集合,环境变量适用于当前所选环境(所有集合中均可使用不同环境变量&#xff09…

【CSP试题回顾】202309-2-坐标变换(其二)

CSP-202309-2-坐标变换(其二) 关键点总结 1.输入输出的同步关闭,以加快I/O操作的速度 这一点还是很重要的,本题代码如果不进行输入输出的同步关闭会时间超限。 ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);2.…

职场中的祖传代码处理建议

程序员是如何看待“祖传代码”的? 祖传代码的由来 在实际的程序员工作中,祖传代码是常见的。因为真正的互联网职场生活中,业务变动调整频繁,每到一个新的业务线,第一件事就是熟悉现有工程代码,看旧文档等…

K8S中POD的控制器

一、Pod控制器及其功用 Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效&am…

Linux基础命令[9]-wc

文章目录 1. wc 命令说明2. wc 命令语法3. wc 命令示例3.1 不加参数3.2 -c(统计字节数)3.3 -m(统计字符数)3.4 -l(统计行数)3.5 -L(最长一行的长度)3.6 -w(统计单词数&am…

Arcgis实现点位空间位置从上到下从左到右排序

效果 背景 工作项目中经常会遇到需要对网格进行编号,而编号是有一定原则的,比如空间位置从上到下从左到右,或者其它原则,那么都可以通过下面的方式来实现 1、准备数据 点shp文件,查看初始FID字段标注,目…

transformer--transformer模型构建和测试

前面几节进行了各种组件的学习和编码,本节将组件组成transformer,并对其进行测试 EncoderDecoder 编码器解码器构建 使用EnconderDecoder实现编码器-解码器结构 # 使用EncoderDeconder类实现编码器和解码器class EncoderDecoder(nn.Module):def __ini…

飞书文档批量导出

背景需求 最近所参与的项目即将结项,需要将飞书中的产品需求文档(PRD)交付给甲方,由于文档较多,大概有两百多个,一个一个的下载导出,太麻烦了(PS:本人比较懒)…

ROS create_wall_timer/create_timer函数区别

在ROS(Robot Operating System)中,create_wall_timer 和 create_timer 是用于创建定时器的两个不同的函数,它们在使用上有一些区别: Clock Type: create_wall_timer: 创建的定时器是基于Wall clock的,这意…

软考笔记--结构化分析方法

结构化分析(SA)方法的基本思想是自定向下,逐层分解,把一个大问题分解成若干个小问题,每一个小问题再分解成若干个更小的问题。经过逐层分解,每个最低层的问题都是足够简单、容易解决的。 SA方法分析模型的…

78. 子集(力扣LeetCode)

文章目录 78. 子集题目描述回溯算法 78. 子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入&#xff…

selenium高亮元素

def set_high_light_elment(self, element): """高亮web元素。 Args: element: WebElement:web元素 """ element_styleelement.get_attribute(style) self.mark_dom_text(element_s…

【MySQL】表的约束——空属性、默认值、列描述、zerofill、主键、自增长、唯一键、外键

文章目录 MySQL表的约束1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 MySQL 表的约束 MySQL中的表的约束是一种规则,用于限制或保护表中数据的完整性和合法性。约束可以确保数据在插入、更新或删除时满足特定的条件,从而维护…

MySQL相关问题

MySQL相关问题 一、MySQL支持哪些存储引擎?二、MySQL是如何执行一条SQL的?三、MySQL数据库InnoDB存储引擎是如何工作的?四、如果要对数据库进行优化,该怎么优化?五、MySQL如何定位慢查询?六、如何分析MySQL…

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代,App已成为人们日常生活的重要组成部分。对于App运营者来说,了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量,为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…

计算机专业必看的十部电影

计算机专业必看的十部电影 1. 人工智能2. 黑客帝国3. 盗梦空间4. 社交网络5. Her6. 模仿游戏7. 斯诺登8. 头号玩家9. 暗网10. 网络迷踪 计算机专业必看的十部电影,就像一场精彩盛宴! 《黑客帝国》让你穿越虚拟世界,感受高科技的魅力《模仿游戏…

公网IP怎么获取?

公网IP是网络中设备的唯一标识符,用于在Internet上进行通信和定位。对于普通用户来说,了解如何获取自己的公网IP是很有必要的,本文将介绍几种获取公网IP的方法。 方法一:通过路由器查询 大多数家庭和办公室使用的路由器都会有一个…

深入解析Mybatis-Plus框架:简化Java持久层开发(七)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本章节介绍如何通过Mybatis-Plus删除数据库中的数据。 本章节不需要前置准备,继续使用之前的测试类,数据库表进行操作。 &#x1f4…

一文详解mysql 的锁

MySQL锁是用于管理数据库中的并发操作的一种机制,它可以确保数据的一致性和完整性。 按范围划分:包括全局锁、表级锁、页级锁和行级锁。 按类型划分:包括间隙锁、临键锁和记录锁。 按级别划分:包括共享锁(S锁&#xff…

如何在Windows轻量应用服务器上安装和配置SSH?

如何在Windows轻量应用服务器上安装和配置SSH? 检查OpenSSH的可用性:首先,需要以管理员身份打开PowerShell并运行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*来检查OpenSSH服务是否可用。如果服务未启动或不可…