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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容