美文网首页
C++ 多重继承(菱形继承)

C++ 多重继承(菱形继承)

作者: MC_DEV_JIN | 来源:发表于2017-08-27 22:55 被阅读413次

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

    class A

    {

    public:

    virtual void f();

    }

    class B: public A

    {

    public:

    virtual void f();

    }

    class C: public A

    {

    public:

    virtual void f();

    }

    //类D多重继承自B,C

    class D: public B, public C

    {

    public:

    void g();

    }

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

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

    而如果用下面的继承方式,B,C通过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();//调用类B的f()方法

    }

    参考原文:http://www.mallocfree.com/interview/cpp-1-c.htm

    相关文章

      网友评论

          本文标题:C++ 多重继承(菱形继承)

          本文链接:https://www.haomeiwen.com/subject/zjoidxtx.html