面试题答案
一键面试多重继承
- 概念:
- 在C++中,一个类可以从多个基类继承属性和行为,这就是多重继承。语法形式为
class Derived : public Base1, public Base2 {...}
,其中Derived
类同时继承了Base1
和Base2
两个基类的成员。
- 在C++中,一个类可以从多个基类继承属性和行为,这就是多重继承。语法形式为
- 解决的问题:
- 它允许一个类整合多个不同基类的功能,使得代码复用更加灵活。例如,在图形绘制系统中,可能有一个
Shape
类表示形状基本属性,Drawable
类表示可绘制的行为。一个Rectangle
类可以通过多重继承从Shape
和Drawable
类继承属性和行为,从而既拥有形状的特征又具备可绘制的能力。
- 它允许一个类整合多个不同基类的功能,使得代码复用更加灵活。例如,在图形绘制系统中,可能有一个
- 存在的问题:
- 菱形继承问题:当存在多个基类继承自同一个基类时,会出现菱形继承结构。例如,
A
为基类,B
和C
继承自A
,D
继承自B
和C
。这样D
类中会存在两份A
类的成员,导致数据冗余,并且在访问A
类成员时可能产生歧义。
- 菱形继承问题:当存在多个基类继承自同一个基类时,会出现菱形继承结构。例如,
虚继承
- 概念:
- 虚继承是一种特殊的继承方式,通过在继承时使用
virtual
关键字,使得在菱形继承结构中,无论该基类被继承多少次,在最终的派生类中只会存在一份该基类的成员。例如class B : virtual public A
,class C : virtual public A
,class D : public B, public C
,这样D
类中只有一份A
类的成员。
- 虚继承是一种特殊的继承方式,通过在继承时使用
- 解决的问题:
- 主要解决菱形继承带来的数据冗余和二义性问题。通过虚继承,在最终派生类中共享一份虚基类的成员,避免了数据的重复存储,并且在访问虚基类成员时不会产生歧义。
- 与多重继承的不同点:
- 成员数量:多重继承在菱形继承结构中会导致最终派生类存在多份共同基类的成员;而虚继承通过特殊的机制,保证最终派生类中只有一份虚基类的成员。
- 内存布局:多重继承下,派生类内存布局中会按照继承顺序依次存放从各个基类继承来的成员;虚继承的派生类内存布局会更复杂,会有额外的指针或偏移量来指向虚基类的共享实例,以确保只有一份虚基类成员。
- 使用场景:多重继承适用于需要整合多个不同基类功能的场景,但要注意避免菱形继承问题;虚继承主要用于解决菱形继承带来的不良影响,在存在菱形继承结构时使用。