C++菱形继承
来源:互联网 发布:库里2016常规赛数据 编辑:程序博客网 时间:2024/06/05 04:47
菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之于接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。
说到菱形继承,就要说到虚继承的概念,对于虚继承,就是为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式 基类名
virtual是关键字,声明该基类为派生类的虚基类。
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。
声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。
1.菱形继承
先看一下菱形继承长什么样。
B和C从A中继承,而D多重继承于B,C。那就意味着D中会有A中的两个拷贝。因为成员函数不体现在类的内存大小上,所以实际上可以看到的情况是D的内存分布中含有2组A的成员变量。如下代码:
转化为代码形式 class A{}; //基类class B:public A{};//子类class C:public A{};class D:public B,public C();如上代码中A,B,C,D就构成了一个菱形继承,如果不用虚基类来实现菱形继承就会导致模糊调用的现象,所谓模糊调用就是说在D的内存中会保留两个基类A的对象,如何解决这个问题,利用虚基类就能很好的解决这个问题,即可改为class B:virtual public A{};//子类class C:virtual public A{};这就是c++臭名昭著的菱形继承现象,而java则没有
0 0
- 【C++】菱形继承
- 【c++】菱形继承
- 【c++】菱形继承
- 【C++】继承(菱形继承)
- <c++>继承及菱形继承
- 【C++】菱形继承与虚拟菱形继承的对比分析
- C++:菱形继承和虚拟继承
- (C++)继承、菱形继承和虚继承的那些事儿
- 【C++】菱形虚拟继承(内存布局)
- 【c++】菱形虚拟虚拟继承模型探索
- C++: 虚表和菱形虚拟继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- LaTex简历模板 Using the LaTeX Resume Templates
- Java使用多线程导入数据到Oracle中
- LaTex初学者模板
- leetcode:Minimum Depth of Binary Tree
- Google I/O大会,炫酷产品汇总
- C++菱形继承
- BaseActivity与BaseFragment的封装
- iOS 证书导出为p12,再导入其他电脑只能导入其中一个的解决方法
- 第107课: Spark Streaming电商广告点击综合案例底层数据层的建模和编码实现(基于MySQL)
- BSG白山极客挑战赛-A-数数字
- sor文件分析软件
- 啦啦啦啦~Django1.96---编写第一个Django应用(6)
- 简析Instgram的搜索架构
- 冒泡排序法