C++继承(二)多继承,菱形继承,继承中同名成员问题的解决,虚继承。虚基类表和虚基类表指针。

目录

一:多继承

1.1:多继承的基本格式

二:菱形继承

2.1:问题及解决方法

三:虚继承

3.1:虚继承的语法格式

3.2:虚基类表和虚基类表指针引出

3.3:虚基类表和虚基类表指针详解

一:多继承

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进行操作时,因为两个指针在使用时自定的偏移量不同,导致最终指向同一个位置。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值