您现在的位置是:首页 >技术杂谈 >C++(继承下)网站首页技术杂谈

C++(继承下)

不会学习的小白O^O 2023-06-26 00:00:02
简介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内存的距离

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。