标题:菱形继承


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()方法

     }



看文字不过瘾?点击我,进入周哥教IT视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注