面试题答案
一键面试菱形继承概念
菱形继承是指在多继承体系中,一个派生类从两个或多个基类继承,而这些基类又共同继承自同一个基类,从而形成一个菱形的继承结构。例如:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
这里A
是顶层基类,B
和C
继承自A
,D
又同时继承B
和C
,形成菱形结构。
引发的问题
- 数据冗余:由于
D
类从B
和C
间接继承了A
类的成员,A
类的成员在D
类对象中会存在两份副本,造成内存浪费。 - 歧义问题:当
D
类对象访问A
类成员时,会出现歧义,编译器不知道应该使用从B
继承过来的A
类成员还是从C
继承过来的A
类成员。例如:
D d;
d.fun(); // 如果A类中有fun函数,这里会出现歧义
解决方法
使用虚继承。在继承关系中,让B
和C
以虚继承的方式继承A
,这样在D
类对象中只会存在一份A
类的成员。修改上述代码如下:
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
虚继承保证无论经过多少次继承,派生类对象中只会有一份共享的虚基类子对象,解决了数据冗余和歧义问题。