栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004563.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号