目录:
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内存的距离