【c++】菱形继承与虚拟菱形继承的对比分析

  

,,,,在继承中经常会遇到这种情况:有一个超类,子类B1, B2继承了,而类D又继承了父类B1, B2。在这种情况下如果按照我们以前的正常的菱形继承的话会有一个问题是子类C会继承两次超一个中类的成员,当在C中想访问继承来自B1, B2中一个的元素会出现两个问题:

,,,,问题一,数据的冗余

,,,问题二,访问的二意性

出现了这种问题那么我们该如何解决呢?

,,,, c++中为了解决这个问题引入了虚拟菱形继承,那么虚拟菱形继承是怎么解决的呢?

首先给大家先画两个图比较下菱形继承和虚拟菱形继承在继承时在内存中的成员分布情况:

,,一、菱形继承:

没有继承以前的超类一个和父类B1, B2;

【c++】菱形继承与虚拟菱形继承的对比分析

继承超类一个以后的B1, B2;

【c++】菱形继承与虚拟菱形继承的对比分析

子类D继承B1, B2以后的内存分布情况

【c++】菱形继承与虚拟菱形继承的对比分析

,,,,通过图我们可以看出菱形继承存在很多的数据冗余,如超类一个的成员ia, ca都有两份,访问时也会出先二义性的错误。


,,,,二,虚拟菱形继承

没有继承以前的超类一个和父类B1, B2;

【c++】菱形继承与虚拟菱形继承的对比分析

虚拟继承超类一个以后的B1, B2;

【c++】菱形继承与虚拟菱形继承的对比分析

虚拟继承B1, B2后的D;

【c++】菱形继承与虚拟菱形继承的对比分析

看完分布图以后,我们看下代码和D在内存中的分布

# include   using  namespace 性传播疾病;      class    {   公众:   ,,,int  ia;   ,,,char  ca;   公众:   ,,,()   ,,,:ia (0)   ,,,,,ca (' A ')   ,,,{}      ,,,virtual  void  f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“:: f ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void 男朋友()   ,,,{   ,,,,,,,cout  & lt; & lt;,“:: Af ()”, & lt; & lt;, endl;   ,,,}   };      class  B1: virtual  public    {   公众:   ,,,int  ib1;   ,,,char  cb1;   公众:   ,,,B1 ()   ,,,:ib1 (1)   ,,,,,cb1 (' 1 ')   ,,,{}   ,,,virtual  void  f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B1: f ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  f1 ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B1: f1 ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  B1f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B1: B1f (), & lt; & lt;, endl;   ,,,}      };      class  B2: virtual  public    {   公众:   ,,,int  ib2;   ,,,char  cb2;   公众:   ,,,B2 ()   ,,,:ib2 (2)   ,,,,,cb2 (“2”)   ,,,{}      ,,,virtual  void  f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B2: f ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  f2 ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B2:: f2 ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  B2f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“B2: B2f (), & lt; & lt;, endl;   ,,,}      };      class  D : public  B1, public  B2   {   公众:   ,,,int  id;   ,,,char  cd;   公众:   ,,,D ()   ,,,,,,,:id (3)   ,,,,,,,,,cd (' D ')   ,,,{}      ,,,virtual  void  f ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“D: f ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  f1 ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“D: f1 ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  f2 ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“D:: f2 ()”, & lt; & lt;, endl;   ,,,}      ,,,virtual  void  Df ()   ,,,{   ,,,,,,,cout  & lt; & lt;,“D:: Df ()”, & lt; & lt;, endl;   ,,,}      };      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

【c++】菱形继承与虚拟菱形继承的对比分析