在继承中经常会遇到这种情况:有一个超类A,子类B1,B2继承了A,而类D又继承了父类B1,B2。在这种情况下如果按照我们以前的正常的菱形继承的话会有一个问题是子类C会继承两次超类A中的成员,当在C中想访问继承来自B1,B2中A的元素会出现两个问题:
问题一、数据的冗余
问题二、访问的二意性
出现了这种问题那么我们该如何解决呢?
C++中为了解决这个问题引入了虚拟菱形继承,那么虚拟菱形继承是怎么解决的呢?
首先给大家先画两个图比较下菱形继承和虚拟菱形继承在继承时在内存中的成员分布情况:
一、 菱形继承:
没有继承以前的超类A和父类B1,B2;
继承超类A以后的B1,B2;
子类D继承B1,B2以后的内存分布情况
通过图我们可以看出菱形继承存在很多的数据冗余,如超类A的成员ia,ca都有两份,访问时也会出先二义性的错误。
二、虚拟菱形继承
没有继承以前的超类A和父类B1,B2;
虚拟继承超类A以后的B1,B2;
虚拟继承B1,B2后的D;
看完分布图以后,我们代码在内存中的分布
时间: 2024-11-05 23:29:08