目录
一:多继承
1.1:多继承的基本格式
class son :public base1, public base2
class(子类名称):(继承方式)(父类名称),(逗号拼接)(继承方式)(父类名称)
后面可以一直使用逗号拼接符拼接下去,
二:菱形继承
我们直接通过一张图来了解一下
例如有一个人类,父亲类从人类那里继承了一个代表年纪的属性,母亲类也从人类那里继承了一个代表年纪的属性,那么在孩子类中,就会出现两个这样代表同样属性的成员变量,
2.1:问题及解决方法
如果我们直接初始化这样的孩子类对象,会出现什么问题呢???
可以看到,我们直接使用m_Age会提示不明确,因为它不知道你使用的是父亲类继承下来的
m_Age还是母亲类继承下来的m_Age。
其实要解决也非常简单,只要加上作用域运算符就可以,加上作用域运算符确定要使用的数据到底是哪个类继承下来的
在这里呢就是指定使用从base1类中继承下来的m_Age。
但是这种解决方式非常的不简洁,这里只有一个从相同的人类上继承的属性m_Age,那么如果有很多这样的属性,就不太好操作了。
三:虚继承
作用:虚继承就是为了解决可能遇到的菱形继承时,同名属性作用域不明确的问题。
3.1:虚继承的语法格式
进行虚继承后,base1与base2就称为虚基类,那么此时子类继承这两个父类时,编译器会自动将那些从同一个person类继承下来的属性,只继承一份。
那么此时我们再去对s1中的m_Age进行操作,我们直接s1.m_Age也不会报错,而且使用作用域运算符输出base1和base2中继承的m_Age地址都是相同的。说明两个虚基类中的m_Age确实只继承了一份。
下面我们来深入的了解一下,这到底是怎么实现的。
3.2:虚基类表和虚基类表指针引出
我们通过base1所占空间大小 来看,base1继承于person类,而person类中,应该只有一个int类型的数据,那么根据结构体的内存对齐方式,这里的结果应该是四个字节,而不是8个字节。所以说在base1中,除了person类中的int类型数据,还有一个其他类型的变量,这个变量就是虚基类表指针。指向一张虚基类表。
3.3:虚基类表和虚基类表指针详解
base1和base2在虚继承与person类时,在这两个子类中都生成了一个虚基类指针,指向两张不同的虚基类表
那么son类在多继承于base1类和base2类时,也会继承这两个类中的虚基类指针,同时也会生成一张虚基类表,那么在对成员m_Age进行操作时,因为两个指针在使用时自定的偏移量不同,导致最终指向同一个位置。