虚继承(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://xiahunao.cn/news/3250663.html

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

相关文章

Websocket自动消息回复服务端工具

点击下载《Websocket自动消息回复服务端工具》 1. 前言 在进行Websocket开发时,前端小伙伴通常是和后端开发人员同步进行项目开发,经常会遇到后端开发人员接口还没开发完,也没有可以调试的环境,只能按照接口文档进行“脑回路开发…

Problems retrieving the embeddings data form OpenAI API Batch embedding job

题意:从OpenAI API批量嵌入作业中检索嵌入数据时遇到问题 问题背景: I have to embed over 300,000 products description for a multi-classification project. I split the descriptions onto chunks of 34,337 descriptions to be under the Batch e…

大数据学习之常见问题1

1、什么是数据仓库? 数据仓库:对数据进行采集、清洗、加工和输出 是一个面向主题的、集成的、随时间变化的、非易失的数据集合,用于支持管理决策过程。 2、通常情况下,分哪些层,分别干什么? ods&#xff1a…

流量卡什么时候激活比较适合,这个问题你考虑过吗?

在办理流量卡时,很多朋友不知道什么时候激活比较划算,在这里文章里,小编给大家简单的说一下,可供参考。 ​ 1、大家要知道,在使用流量卡时,流量卡的激活时间就是号卡的入网时间,也是计费的开始。…

SDXL 1.0 下载和部署

SD XL 1.0 重磅更新!免费开源可商用(附在线使用本地部署教程) - 优设网 - 学设计上优设 三、本地部署 SDXL 1.0 SDXL 1.0 的源文件已经在 Huggingface 上开源了,我们可以通过 Stable Diffusion WebUI 在本地免费使用 SDXL 1.0&am…

【深度学习】【Lora训练4】StabelDiffusion,人物lora训练

启动: docker run -it --gpus all --net host -v /ssd/xiedong/xiezhenceshi/lora_train:/ssd/xiedong/xiezhenceshi/lora_train kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers-lora-train bashrootgpu16:/workspace/lora-scripts# python…

微信小程序:vant-weapp 组件库、css 变量

vant-weapp 组件库 前往 vant-weapp 官网 npm 使用限制:不支持依赖于 Node.js 内置库、浏览器内置对象、C 插件 的包。 安装 vant-weapp # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i…

基于STM32智能电子锁设计

1.简介 随着时代的高速发展,家居安全也成为人们日常生活中的一个安全问题。目前传统的门锁使用的是机械密码,在安全性方面表现不佳。这些缺点可以通过改用智能电子密码锁来弥补。智能电子锁是一种使用了现代电子技术的高科技产品,它的出现解决…

CH03_布局

第3章:布局 本章目标 理解布局的原则理解布局的过程理解布局的容器掌握各类布局容器的运用 理解 WPF 中的布局 WPF 布局原则 ​ WPF 窗口只能包含单个元素。为在WPF 窗口中放置多个元素并创建更贴近实用的用户男面,需要在窗口上放置一个容器&#x…

15. 【C++】详解搜索二叉树 | KV模型

目录 1.定义 初始化 插入 查找 删除 完整代码 2.运用 K 模型和 KV 模型详解 K 模型 KV 模型 代码解释 为了更好地理解 map 和 set 的特性,和后面讲解查找效率极高的平衡搜索二叉树,和红黑树去实现模拟,所以决定在这里对搜索二叉树…

【06】LLaMA-Factory微调大模型——微调模型评估

上文【05】LLaMA-Factory微调大模型——初尝微调模型,对LLama-3与Qwen-2进行了指令微调,本文则介绍如何对微调后的模型进行评估分析。 一、部署微调后的LLama-3模型 激活虚拟环境,打开LLaMA-Factory的webui页面 conda activate GLM cd LLa…

基于STM32的智能加湿器设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的题目是:《7、基于STM32的智能加湿器设计…

4 C 语言控制流与循环结构的深入解读

目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…

查看Windows中监听的端口及其关联的服务

文章目录 I 查看Windows中监听的端口及其关联的服务进程id1.1 列出了所有监听的端口及其关联的服务1.2 查找特定的端口是否开放1.3 查看哪些服务正在监听这些端口II 根据进程id查看进程名称基于cmd窗口,查看程序运行端口状态(关联服务进程id)和关联的服务进程信息 I 查看Win…

LLM大模型实战项目--基于Stable Diffusion的电商平台虚拟试衣

本文详细讲解LLM大模型实战项目,基于Stable Diffusion的电商平台虚拟试衣 一、项目介绍 二、阿里PAI平台介绍 三、阿里云注册及开通PAI 四、PAI_DSW环境搭建 五、SDLORA模型微调 一、项目介绍 AI虚拟试衣是一种创新的技术,利用人工智能和计算机视觉技…

MacBook电脑远程连接Linux系统的服务器方法

一、问题简介 Windows 操作系统的电脑可使用Xshell等功能强大的远程连接软件。通过连接软件,用户可以在一台电脑上访问并控制另一台远程计算机。这对于远程技术支持、远程办公等场景非常有用。但是MacBook电脑的macOS无法使用Xshell。 在Mac上远程连接到Windows服…

Golang | Leetcode Golang题解之第238题除自身以外数组的乘积

题目: 题解: func productExceptSelf(nums []int) []int {length : len(nums)// L 和 R 分别表示左右两侧的乘积列表L, R, answer : make([]int, length), make([]int, length), make([]int, length)// L[i] 为索引 i 左侧所有元素的乘积// 对于索引为 …

Java(二十二)---队列

文章目录 前言1.队列(Queue)的概念2.Queue的使用3.队列的模拟实现4.循环队列5.双端队列6.面试题[1. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)[2. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/de…

django中日志模块logging的配置和使用

一、文件的配置 settings.py文件中添加LOGGING块的配置,配置如下 # 日志记录 LOGGING {"version": 1,"disable_existing_loggers": False, # 用于确定在应用新的日志配置时是否禁用之前配置的日志器# 格式器"formatters": {"v…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中,网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框,还是更复杂的模态对话框,都可能中断测试脚本的正常执行,导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…