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