『 C++类与对象 』多继承与虚继承

news2024/11/26 14:38:38

文章目录

    • ⌨️多继承的概念
      • 语法 🖱️
    • ⌨️棱形继承
    • ⌨️虚继承
      • 虚继承是如何解决数据冗余和二义性的(不谈虚表概念)?🖱️


⌨️多继承的概念

多继承指的是一个派生类是由多个基类继承而来的;

而在生活当中也有类似的例子:番茄既可以是水果,也可以是蔬菜;

而在C++2.0的版本中,就提出了多继承的概念,多继承允许一个派生类是由多个基类继承而来;


语法 🖱️

class Teacher {
protected:
 int _id;//工号
};

class Student{//使用virtual关键字
protected:
 int _num;//学号
};

class Grad : public Teacher ,public Student{
protected:
 string _major;
};

以该类为例:

该类中出现了Teacher老师类类与Student学生类两个类;

同时举出了一个Grad研究生类代表Teacher类与Student两个类的派生类;

上述语法即为多继承;


⌨️棱形继承

虽然棱形继承一定程度提高了继承的多样性;

但随之而来的也是一定的问题;

以多继承为基础,同时也出现了棱形继承;

棱形继承是在多继承基础上产生的,假设一个基类拥有多个派生类,并在多次继承之后又将其若干个派生类(或者其子类)多继承了一个派生类即为棱形继承;

【一个标准的棱形继承】

以图来看棱形继承并不存在过多问题;

但棱形继承的本质问题为数据冗余以及存在数据的二义性;

假设有一个类为Person;

class Person{
public:
 string _name;
};

以该类继承出了两个派生类分别为TeacherStudent类;

class Teacher :  public Person{
protected:
 int _id;//工号
};

class Student :  public Person{//使用virtual关键字
protected:
 int _num;//学号
};

最后以上面的两个类作为基类再继承了一个派生类为Grad

class Grad : public Teacher ,public Student{
protected:
 string _major;
};

此时的Grad类中被继承的Person中的_name成员该从TeacherStudent中哪个类访问;

这就是所谓的二义性;

以图中34,35行为例,可以这么解决数据的二义性问题(使用域作用限定符使得数据指向一个类域之中);

但是对于类中的数据冗余是不可避免的;

这里的类中以内置类型(不存在在堆中开辟空间)为例,若是存在需要开辟空间将会是一个较高的数据冗余问题;

如果从上个例子不能很好的观察到所谓的数据冗余和二义性的问题,接下来我将再举一个例子,并以GDB调试的形式观察其中的问题;

假设存在一段代码:

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;
};

void test_2(){
 D d;
 d.C::_a = 1;
 d.B::_a = 2;
 d._b = 3;
 d._c = 4;
 d._d = 5;
}

编译并使用-g选项生成一个可调试的可执行程序;

并在GDB调试中再test_2函数的最后一行处打上断点并运行,在该断点处打印此时对象d时的状态;

此时的d对象中存在两个A类中的属性,这就是数据冗余;


⌨️虚继承

当然在紧接着在该版本的后一个版本中更新了对于解决棱形继承的问题 —— 虚继承virtual

关键字virtual即为虚继承的关键字;

语法:

class A {
  public:
    int _a;
};

class B : virtual public A{//使用virtual关键字表示虚继承
  public :
    int _b;
};

class C : virtual public A{
  public :
    int _c;
};

class D : public B, public C{
  public :
    int _d;
};



虚继承是如何解决数据冗余和二义性的(不谈虚表概念)?🖱️

以上面的代码为例,此时一样采用GDB调试的方式进行观察;

class A {
  public:
    int _a;
};

class B : virtual public A{//使用virtual关键字表示虚继承
  public :
    int _b;
};

class C : virtual public A{
  public :
    int _c;
};

class D : public B, public C{
  public :
    int _d;
};

void test_2(){
D d;
d.C::_a = 1;
d.B::_a = 2;
d._b = 3;
d._c = 4;
d._d = 5;
}

由于对于GDB调试来说并不是很好观察,所以采用可能比较麻烦的方式对其进行调试;

打印出对应的地址并对其进行观察:

从图中的可以看出内存的大致分布;

d对象的首地址处可以看到存储了一个指针,这个指针所指向的位置为一个数值(偏移量);

可以看到在_c_b之间的内存中其中一处所存储的为一个指针,而该指针指向的位置也存储了一个指针,而这个指针正是存储偏移量0x00000010的,而通过这个内存的地址0x7fffffffe430+这个偏移量即可访问到这个虚继承体系中公共的成员;

当需要对虚继承中共有的成员数据进行操作时将以特定的形式对这个共有的数据进行访问;

同时在一般情况下请不要使用虚继承,同时也尽量不要使用棱形继承;

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

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

相关文章

[100天算法】-面试题 17.11.单词距离(day 68)

题目描述 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?示例:输入:word…

华为Auth-Http Serve任意文件读取

1.漏洞描述 华为Auth-Http Server 1.0任意文件读取,攻击者可通过该漏洞读取任意文件。 2.网络资产查找 FOFA:server”Huawei Auth-Http Server 1.0” 2、部分界面如下 3、Poc /umweb/shadow 4、Poc批量验证 id: huanwei-auth-http-server-filereadi…

商业模式思维导图

一、什么是商业模式?简单的说,商业模式就是公司通过什么途径或方式来赚钱? 商业模式的核心是 创造价值-获取价值-传递价值。 它有3个重要的环节,创造价值是基于客户需求,提供解决方案,传递价值是通过资源配…

5个写自定义函数小练习

计算列表平均值、素数判定、反转字符串,查找整数列表最大最小值、统计字符串中元音字母个数(大小写字不敏感)。 (笔记模板由python脚本于2023年11月09日 21:50:35创建,本篇笔记适合熟悉Python函数及基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】…

Python克隆单个网页

网上所有代码都无法完全克隆单个网页,不是Css,Js下载不下来就是下载下来也不能正常显示,只能自己写了,记得点赞~ 效果如图: 源码与所需的依赖: pip install requests pip install requests beautifulsoup4…

ThreadLocal原理以及内存泄露问题

1、ThreadLocal实现原理 1、每个线程中有一个ThreadLocalsMap,这是一个哈希表的结构里面有很多entry(也就是k-v),当我们使用ThreadLocal进行set值的时候,会将这个threadLocal设置为key,然后值设置为value放入ThreadLocalsMap,key为弱引用&am…

Vue计算属性 computed

计算属性&#xff1a;常用于逻辑比较复杂的计算&#xff0c;根据已有的数据&#xff0c;计算出一个新的数据。计算属性具有缓存机制&#xff0c;复用性强&#xff0c;效率更高。 计算属性【简写方式】&#xff1a; <template><div>提现金额&#xff1a;<input …

qt-C++笔记之Qt中的时间与定时器

qt-C笔记之Qt中的时间与定时器 code review! 文章目录 qt-C笔记之Qt中的时间与定时器一.Qt中的日期时间数据1.1.QTime&#xff1a;获取当前时间1.2.QDate&#xff1a;获取当前日期1.3.QDateTime&#xff1a;获取当前日期和时间1.4.QTime类详解1.5.QDate类详解1.6..QDateTime类…

ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端系统测试安装教程

播资源提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;…

不定积分第一类换元法(凑微分法)

将其中的 分解为 相当于 令 那么. 就可以得到 例题1 令 那么 因为 所以 利用基本积分公式 结果 例题2 上下同除 接下来需要一些技巧 这个形式需要联想到一个基本积分公式 不巧是这里是2不是1需要利用技巧把2变成1

GDPU 数据结构 天码行空9

实验九 哈夫曼编码 一、【实验目的】 1、理解哈夫曼树的基本概念 2、掌握哈夫曼树的构造及数据结构设计 3、掌握哈夫曼编码问题设计和实现 二、【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成&#xff0c;它们在电文中出现的概率分别为{ 0.…

拍摄视频的时候相机断电导致视频文件损坏,怎么修复

3-4 现在好多人都有自己的相机&#xff0c;但是专业用来录像的机器应该是不太可能都有的&#xff0c;相机的稳定性会比专业的机器差一些&#xff0c;如果用于比较重要的场景&#xff0c;比如婚庆、会议录像、家庭录像使用等&#xff0c;有较少的概率会出现一些奇怪的情况&…

mysql千万数据快速插入-实战

文章目录 前言环境一、配置二、效果总结 前言 数据量太大了&#xff0c;每天半夜要同步很大数据到 mysql 数据库&#xff0c;其中一张表就上2千万&#xff0c;总计上亿条数据。同步任务每天0点之后开始任务&#xff08;因为到0之后才能统计前一天数据&#xff09;&#xff0c;…

Matlab设置figure中标题/图例英文不同字体

1.创建一个曲线图 x linspace(-10,10,200); y sin(4*x)./exp(x); plot(x,y) xlim([0 10]) ylim([-0.4 0.8]) xlabel(a); ylabel(b); title(曲线图sapi); set(gca,FontName,Times New Roman,fontsize,16); legend(曲线12)标题中既包含英文又包含中文&#xff0c;如果设置字体…

selenium xpath定位

selenium-xpath定位 <span style"background-color:#2d2d2d"><span style"color:#cccccc"><code class"language-javascript">element_xpath <span style"color:#67cdcc"></span> driver<span styl…

java中的对象克隆(浅克隆和深克隆)

在实际项目中&#xff0c;一个模型类需要为不同的层提供不同的模型。VO DO DTO 需要将一个对象中的数据克隆到其他对象中。 误区&#xff1a;这种形式的代码复制的是引用&#xff0c;即对象在内存中的地址&#xff0c;stu1和stu2两个引用指向的是同一个对象 Student stu1 new…

【c++】——类和对象(中)——赋值运算符重载

作者:chlorine 专栏:c专栏 你站在原地不动,就永远都是观众。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载的初步认识 &#x1f308;运算符重载 &#x1f308;赋值运算符重载格式 (上) &#x1f308;operator__判断俩个日期是否相等 &#x…

万宾科技智能井盖,实现对井盖的监测

随着人工智能和物联网技术的不断变化&#xff0c;各种适用于市政府提高管理能力和公共服务水平的高科技产品不断更新。在道路基础设施建设过程中&#xff0c;智能井盖传感器的出现时刻保护着城市地下生命线&#xff0c;而且可以对地下水道井盖进行实时的监测并完成数据上传等工…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者&#xff1a;Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability&#xff08;技术预览版&#xff09;、Universal ProfilingTM 和 Elastic APM 集成&#xff0c;以及针对 Elastic Observability 的新 SLO &#…

判断sparse matrix是否是对称矩阵

参考&#xff1a; https://stackoverflow.com/questions/48798893/error-in-checking-symmetric-sparse-matrix import scipy.sparse as sp import numpy as np np.random.seed(1)a sp.random(5, 5, density0.5)a结果如下 sym_err a - a.T sym_check_res np.all(np.abs(s…