目录:

  • C++继承机制(一)——基本语法、三种继承方式、继承哪些数据
  • C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式
  • C++继承机制(三)——多继承、菱形继承、虚继承原理

本篇涉及内容:

  • 多继承
  • 菱形继承
  • 虚继承

C++中的多继承:

1)基本语法:class SubClass : public SuperClass1, public SuperClass2

2)多继承可能出现的问题:

  • 当父类与父类之间出现成员同名的情况

    此时访问这些父类间的同名成员需要加上父类作用域用于区分是来自哪个父类的成员

菱形继承:

1)基本概念

有两个子类同时继承了同一个父类,然后又有一个类多继承了这两个子类

2)菱形继承可能会出现数据杂冗问题

比如动物都有sex这个属性
所以羊和驼这两个类都继承了这个属性
当羊驼类多继承羊和驼这两个类时,则会重复继承分别来自羊类和驼类的sex属性
羊驼类中要两份这样的数据没有有意义
这样在羊驼类中就出现了数据杂冗的问题

如何解决菱形继承中出现的数据杂冗问题?

  • 利用虚继承

    1. 什么是虚继承?

      在继承方式前加上关键字virtual即可,此时Animal类称为虚基类

    2. 虚继承的底层原理

      每一个继承了虚基类的子类中都会有:
      vbptr——虚基类表指针(virtual base table pointer)占用4个字节
      vbtable——虚基类表(virtual table)不占用内存
      子类中的虚基类表指针指向了虚基类表
      虚基类表中记录了虚基类与本类的偏移地址
      通过这个偏移地址就可以找到虚基类中的成员
      这样一来羊类和驼类就共同维护同一份虚基类的成员数据
      同样虚基类表指针也会继承给下一个子类

      需要注意的是:虚基类中的成员依旧会继承到子类中,但是其所有子类还有间接子类(Animal和SheepTuo),都只会存在其一份成员数据,下面我们用代码来验证.

      这里的SheepTuo类的大小为12字节,其继承过来了Sheep类和Tuo类的虚基类表指针,和一份Animal类中的age成员变量,虚继承解决了之前普通继承出现的数据杂冗的情况.

  • 有关虚继承和虚基类更详细的介绍:
    介绍了有关虚基类的构造
    详细介绍了其底层原理

C++继承机制(三)——多继承、菱形继承、虚继承原理相关推荐

  1. 关于虚继承(在钻石继承体系中,一定要用虚继承!)

    在钻石继承体系中,一定要用虚继承! 1.下面的代码块儿无法通过编译,原因是,A3无法确定自己到底是用哪一个父类中的函数. class A { public: virtual void f(){} vi ...

  2. c++基础知识点(6)类的继承,构造,析构顺序,虚继承等

    学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...

  3. 有虚继承的类其有几个虚继承的基类则该类就有几个虚表

    对于下面的测试代码(64位系统):C类继承了A  B 均为虚类,所以在结果中sizeof(C) 结果为32 #include<iostream> using namespace std; ...

  4. C++继承机制(一)——基本语法、三种继承方式、继承哪些数据

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  5. C++继承详解三 ----菱形继承、虚继承

    转载:http://blog.csdn.net/pg_dog/article/details/70175488 今天呢,我们来讲讲菱形继承与虚继承.这两者的讲解是分不开的,要想深入了解菱形继承,你是绕 ...

  6. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  7. ECMAScript 继承机制实现

    继承机制的实现 要用 ECMAScript 实现继承机制,您可以从要继承的基类入手.所有开发者定义的类都可作为基类.出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码 ...

  8. 内存首地址为1000h_C++虚继承,菱形继承,内存分布

    前言 在叙述C++虚继承之前,我先给大家抛出一个问题.例如现在有4个类,分别是class A, class B, class C, class D.它们的关系如下图. 如上如所示,class B和cl ...

  9. c++ 继承机制易犯的错误

    继承作为面向对象的基本特征之一,其使用率极高.不管是为了实现软件的基本功能,还是再程序的重构的过程中,我们总是会用到继承机制.正是因为其用途极为广泛,而且使用简单,大众程序员对其真正的内部实现机制的探 ...

最新文章

  1. 鸿蒙升级名单确认最新,华为鸿蒙系统升级名单正式确认!全面替换安卓:流畅度比肩iOS...
  2. 基于Boost.Thread 的测试
  3. async-await用法
  4. 网络基础:计算机网络由基础到深入常用知识集锦!
  5. 【DP】合唱队形(jzoj 1122)
  6. mysql 增量备份脚本_MySQL自动化(全量+增量)备份脚本
  7. javascript字典中添加数组_如何在 JavaScript 中更好地使用数组
  8. vue:在router里面给页面加title
  9. 你要了解的11款面向Linux系统的一流备份实用工具
  10. 理解python先编译后解释的特点
  11. java中汉语转化成拼音的使用详解
  12. 常见的用户密码加密方式以及破解方法
  13. 第4章 Vue全家桶(vue-router+vuex) - 4.23 如何添加商品到购物车中6步骤
  14. Window10 IoT家庭物联网网关系统设计
  15. 道客巴巴免费下载文档技巧
  16. 跟苹果学习如何开好一场产品发布会
  17. 设置图像感兴趣区域(RIO)
  18. 智控网络——智谋云价签,与智慧门店同飞跃、共变革
  19. 如何word/wps插入电子签名
  20. 明晚(29日)20点,直播预告:鉴书会《你的灯亮着么》,暨“中老年产品人关怀计划” 7月收官场...

热门文章

  1. c# https请求
  2. 视觉里程计07 Qt的一些bug修改记录
  3. vue05-REST 请求
  4. 说说你对工厂模式的理解
  5. 洛谷 1373 dp 小a和uim之大逃离 良心题解
  6. python从网络时间服务器获取并打印当前时间以及pip安装ntplib的一次体验
  7. 【恋上数据结构】插入排序及二分搜索优化
  8. 【恋上数据结构】排序算法前置知识及代码环境准备
  9. 设计模式11_装饰器
  10. linux软raid 系统坏了,LINUX下软RAID的制造及如何查看坏盘?