虚继承(C++)

目录

菱形继承

虚继承

虚继承原理

 虚继承使用注意事项:


                          不要把所有的遗憾都留给未来,趁年轻出去走走,

                  让我们用心去感受这个世界,用脚步去丈量这个世界的距离。

这里是来自M--Y的专栏:C++启()航

以下内容均为个人见解,如有不足还请指出

期待大家的点赞、收藏、评论(互三必回)诸君共勉

             

菱形继承

单继承:一个子类只有一父类

                          

多继承:一个子类有两个或者两个以上的直接父类

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

      

从上图可以看出类Student和类Teacher都继承了Person,当类Assistant同时继承Student和Teacher,就会有两份Person,由此可见菱形继承会产生数据冗余和二义性的问题。

数据冗余:一个类中存在重复数据

二义性:访问时无法确定准确访问的是哪一个,需要指定访问

因此推出虚继承来解决此类问题

虚继承

class Person
{
public :
        string _name ; // 姓名
};
class Student : virtual public Person
{
protected :
        int _num ; // 学号
};
class Teacher : virtual public Person
{
protected :
        int _id ; // 职工编号
};
class Assistant : public Student , public Teacher
{
protected :
        string _majorCourse ; // 主修课程
};
void Test ()
{
        Assistant a ;
        a . _name = "peter" ;
}

看上图可知虚继承就是在下面子类可能会产生数据冗余和二义性的父类继承前面加一个virtual

虚继承原理

下面是借助内存窗口观察对象成员模型

class A
{
public :
        int _a ;
};
// class B : public A
class B : virtual public A
{
public :
        int _b ;
};
// class C : public A
class C : virtual public A
{
public :
        int _c ;
};
class D : public B , public C
{
public :
        int _d ;
};
int main ()
{
        D d ;
        d . B::_a = 1 ;
        d . C::_a = 2 ;
        d . _b = 3 ;
        d . _c = 4 ;
        d . _d = 5 ;
        return 0 ;
}

 先来观察没有进行虚继承前的内存窗口

          

再观察进行虚继承后的内存窗口

可以看到经过虚继承后D对象将A放到了对象组成成员的最下面,这个A同时属于B和C。

那么B和C是如何去找到公共的A的呢?

其实这里是通过B和C的两个指针,指向同一张表,这两个指针叫虚基表指针(vbptr),这两个表叫虚基表。

虚基表中存的偏移量。这个量就是表的的地址到父类地址的距离。通过偏移量可以找到下面的A。

以B虚基表为例:距离差为F770-F75C=14(16进制)         
                                                

              

 虚继承使用注意事项:

1.当使用虚继承的时候,需要注意,虚继承只有在多继承时才有用。也就是说如果只有一层继承关系或者是单继承都将不起作用。

2.因为虚继承是保证子类中只有一个间接父类,说简单一点就是虚继承只能在隔代继承中起作用

当出现上图情况时,虚继承写在D处,将无法再E中实现虚继承的效果,必须写在B处。 

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

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

相关文章

SAP ABAP 批导函数(封装版)

EXCEL批导函数相信大家熟悉的不能再熟悉了,但是特殊场景不同函数对工作的影响真的很大。 整理本篇文章是因为公司电脑统一使用了加密系统,通过先前的统一函数无法直接上传,每次都要先另存为TEXT文本后上传,用户体验非常差&#x…

持续集成01--Git版本管理及基础应用实践

前言 本系列文章旨在深入探讨持续集成/持续部署(Continuous Integration/Continuous Deployment, CI/CD)流程中的各个环节,而本篇将聚焦于Git版本管理及其基本应用。通过本文,读者将了解到Git的基本原理、安装配置、基本命令以及如…

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页: 品牌管理增加模糊查询: 品牌管理关联分类: 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系,用中间表 涉及的类: 方法都比较简单,就不贴代码了

无线物联网新时代,RFID拣货标签跟随潮流

拣选技术的演变历程,本质上是从人力操作向自动化、智能化转型的持续进程。近期,“货寻人”技术成为众多企业热烈追捧的对象,它可以根据企业的特定需求,从众多拣选方案中选出最优解。那么,在采用“货到人”拣选技术时&a…

【python】OpenCV—Scanner

文章目录 1、需求描述2、代码实现3、涉及到的库函数cv2.arcLengthcv2.approxPolyDPskimage.filters.threshold_localimutils.grab_contours 4、完整代码5、参考 1、需求描述 输入图片 扫描得到如下的结果 用OpenCV构建文档扫描仪只需三个简单步骤: 1.边缘检测 2.使用图像中…

VS code配置docker远程连接

一 前置条件 1、本地已安装docker 2、服务端docker已配置Docker配置远程连接 二 VScode安装docker扩展 三 执行docker命令 1、切换到远程docker节点 docker context create remote-docker --docker "hosthttp://192.168.6.9:2375" 2、使用远程节点 docker cont…

PyTorch 深度学习实践-逻辑斯蒂回归

视频指路 参考博客笔记 参考笔记二 用来分类的模型 说明:1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面,添加了激活函数(非线性变换) ​ 2、分布的差异:KL散度,cross-entropy交叉熵 现在损失函数衡量不是距离而是分布…

学习react-环境手脚架页面路由

1. 搭建环境 安装node和npm 在下面网址下载node,并安装 https://nodejs.cn/ #检测是否ok node -v npm -v安装react npm install -g create-react-app2. 创建手脚架(TypeScript) create-react-app my-app --template typescript cd my-a…

昇思25天学习打卡营第15天|两个分类实验

打卡 目录 打卡 实验1:K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2:基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置(训练/验证/推理) 数据预处理 MobileNetV2模型搭建 Mobile…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…

钡铼分布式 IO 系统 OPC UA边缘计算耦合器BL205

深圳钡铼技术推出的BL205耦合器支持OPC UA Server功能,以服务器形式对外提供数据。符合IEC 62541工业自动化统一架构通讯标准,数据可以选择加密(X.509证书)、身份验证方式传送。 安全策略支持basic128rsa15、basic256、basic256s…

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。(add /commit /版本撤销回退/分支管理) Git是一个分布式 的版本控制系统。 分支…

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

算法工程师第十四天(找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树 )

参考文献 代码随想录 一、找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 层次遍历&#…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等,确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

Pytorch学习笔记day3——用神经网络学习一组函数

好的,我们开始吧。首先第一个问题,神经网络的本质是什么?是古典主义的人类的神经元吗?绝对不是,他只是一个优化函数 y f θ ( x ) y f_{\theta}(x) yfθ​(x) 这和小学学到的线性函数拟合并无本质区别。只是其中参数…

uniapp form表单校验

公司的一个老项目,又要重新上架,uniapp一套代码,打包生成iOS端发布到App Store,安卓端发布到腾讯应用宝、OPPO、小米、华为、vivo,安卓各大应用市场上架要求不一样,可真麻烦啊 光一个表单校验,…

云手机结合自主ADB命令接口 提升海外营销效率

现在,跨境电商直播已经成为在线零售的重要渠道,在大环境下,确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口,为电商直播营销提供了技术支持,使得应用开发、测试、优化和运维更加高效。 什么是A…

【sklearn | 7】:scikit-learn项目实战指南

引言 在数据科学和机器学习领域,Python以其简洁的语法和强大的库支持,成为了许多开发者和研究者的首选语言。而在众多Python机器学习库中,scikit-learn以其易用性、灵活性和强大的算法集合,成为了最受欢迎的库之一。本文将深入探…

【驱动程序】霍尔编码器电机_CubeMX_HAL库

【驱动程序】霍尔编码器电机_CubeMX_HAL库 电机型号:MG310 霍尔编码器电机 驱动模块:L298N 接线 注: L298N 12V接线柱位置可以接50V~5V当跳线帽接入时,5V接线柱为5V输出,可以给驱动板供电当跳线帽拔出时&#xff0…