当前位置: 首页 > article >正文

C++(继承下)

目录:

         1.继承与有元

         2.继承与静态成员

         3.单继承、多继承

         4.如何定义一个不能被继承的类??

         5.分享有意思的一道题

         6.菱形继承及菱形虚拟继承

-------------------------------------------------------------------------------------------------------------------------

1.继承与有元

直接给结论  : 有元关系不能被继承(也就是说基类有元不能不能访问子类私有和保护成员

有元函数是一种定义在类外的函数,但是需要在类内声明即可(有元函数是可以在类外访问类内的变化/私有成员的一种特殊函数)

 但是如果Display也许想在类外访问子类的私有/保护成员怎么办呢???

--------------------------------------------------------------------------------------------------------------------------------

2.继承与静态成员

基类定义了static静态成员,则各个继承体系里面只有一个这样的成员

 但是对于static修饰了的_count就不一样了

 地址也都是相同的

 --------------------------------------------------------------------------------------------------------------------------

3.复杂的菱形继承及菱形虚拟继承

单继承 : 一个子类只有一个直接父亲时我们称这个继承关系为单继承

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

 

 --------------------------------------------------------------------------------------------------------------------------------

4.如何定义一个不能被继承的类??

 5.分享有意思的一道题

分析 p1 、 p2 、p3 的大小关系

 现在这个Derive这个类有3个部分构成   一个Base1 Base2两个父类和它自己本身的成员构成

Derive继承了Base1 、 Base2谁在前谁在后呢???

先继承的在前面

 

 p1和p3指向的是同一个位置,但是意义是不一样的

p3指向这个位置看的是整体,p1指向这个位置看的是Base1那个部分

p1=p3 !=p2

我们可以来探索一下p1/p3   与p2的大小关系

 可以看出来 p2大于p1/p3       ---  这是为什么呢???

------------------------------------------------------------------------------------------------------------------

6.菱形继承

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

我们先看看菱形继承的问题

数据冗余和二义性

 在Assistant中Person的成员会有两份

二义性是Assistant的对象去访问_name不知道是要去访问谁的

二义性问题的解决很简单,指定作用域就可以了

 那么我们该怎么解决这边的数据冗余问题呢???

C++引出了菱形虚拟继承     -----     virtual(虚继承)

 

 菱形虚拟继承解决了二义性和虚拟继承

那么虚继承是如何解决二义性和数据冗余的呢????

这是在不使用菱形虚拟继承的情况下,通过指定作用域来解决二义性的问题,并查看了D在内存中的存储结构

我们再来看看虚继承之后的D中的成员在内存中的存储结构

 

 解决了数据冗余和二义性

但是我们发现我们多使用了4字节的空间,浪费了空间,好像并没有节省空间

 但是你节省的是A对象,此时A对象是一个只有一个整形成员,但是如果A当中的成员是一个数组呢 _a[1000]    4000个字节    ,那么我们如果不使用虚继承的话,在内存当中B 、C对象都继承一份,就需要8000字节,但是如果使用虚继承的话,就只需要存一份在公共区域4000字节,只是多花4字节的指针指向这个区域罢了

-------------------------------------------------------------------------------------------------------------------

B 、 C对象空间里面的东西到底是什么

 多出来的这两个,貌似是地址

20、12是一个距离,偏移量,是距离这个公共的A内存的距离


http://www.kler.cn/a/14955.html

相关文章:

  • Node.js二:fs模块
  • js 各种数据类型互相转换的函数
  • python算法中的深度学习算法之长短时记忆网络(详解)
  • 【社区图书馆】-《科技服务与价值链》总结
  • CVPR 2023 | 语义分割新范式:点监督遇上隐式场
  • Linux系统与shell编程第一节课
  • 智慧园区数字化转型下的移动App发展
  • Flex布局
  • 系统调用与用户态陷入内核态
  • AUTOSAR文档如何阅读 -- 这些缩写是干嘛的!!!
  • Ceph入门到精通-红帽 Ceph 存储 RGW 部署策略和规模调整指南
  • EU GMP附录一与关键区域空气微生物取样方案及相关法规标准解读
  • pycocoevalcap代码的使用和问题解决
  • 组播IGMPv1协议
  • vue/react项目刷新页面出现404的原因以及解决办法
  • Android 11.0 framework中根据包名设置某个app横屏显示
  • SpringBoot项目结构及依赖技术栈
  • Vue项目的性能优化
  • 每日学术速递4.24
  • Android开发:使用sqlite数据库实现记单词APP