在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:菱形继承

C++支持多重继承。来看看下面一组继承关系:

 

class A

{

public:

         virtual void f();

    

}

class B: public A

{

public:

         virtual void f();

    

}

class C: public A

{

public:

         virtual void f();

}

//D多重继承自BC

class D: public B, public C

{

public:

         void g();

}

BC继承于A,而D又继承于BCC++中称这种继承关系为菱形继承。如图1所示,此种继承方法一个不足之处为,在D的对象中,保存了2A类中的数据成员。

       

                                                               图1 非虚基类继承对象结构布局

而如果用下面的继承方式,BC通过virtual方式继承A,那么如图2所示,D中就只有一份关于A的数据成员了。

 

class A

{

public:

         virtual void f();

 

    

}

class B: virtual public A

{

public:

         virtual void f();

    

}

class C: virtual public A

{

public:

     virtual void f();

    

}

class D: public B, public C

{

public:

         void g();

    

}

 

                                                                    图2 虚基类继承对象结构布局

此外,菱形继承还会带来二义性。例如上面例子中,如果在D中定义函数D::g()时引用了f()函数:

 

     void D::g()

     {

         f();

     }

 

将无法知道f()是输入类B还是类C。为了避免二义性,需要显示的指出f()的出处。

 

     void D::g()

     {

         B::f();  //调用类Bf()方法

     }