MST

星途 面试题库

面试题:C++中多重继承与虚继承的区别

请详细阐述C++中多重继承与虚继承的概念,并说明它们在解决什么问题以及有哪些不同点。
31.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

多重继承

  1. 概念
    • 在C++中,一个类可以从多个基类继承属性和行为,这就是多重继承。语法形式为class Derived : public Base1, public Base2 {...},其中Derived类同时继承了Base1Base2两个基类的成员。
  2. 解决的问题
    • 它允许一个类整合多个不同基类的功能,使得代码复用更加灵活。例如,在图形绘制系统中,可能有一个Shape类表示形状基本属性,Drawable类表示可绘制的行为。一个Rectangle类可以通过多重继承从ShapeDrawable类继承属性和行为,从而既拥有形状的特征又具备可绘制的能力。
  3. 存在的问题
    • 菱形继承问题:当存在多个基类继承自同一个基类时,会出现菱形继承结构。例如,A为基类,BC继承自AD继承自BC。这样D类中会存在两份A类的成员,导致数据冗余,并且在访问A类成员时可能产生歧义。

虚继承

  1. 概念
    • 虚继承是一种特殊的继承方式,通过在继承时使用virtual关键字,使得在菱形继承结构中,无论该基类被继承多少次,在最终的派生类中只会存在一份该基类的成员。例如class B : virtual public Aclass C : virtual public Aclass D : public B, public C,这样D类中只有一份A类的成员。
  2. 解决的问题
    • 主要解决菱形继承带来的数据冗余和二义性问题。通过虚继承,在最终派生类中共享一份虚基类的成员,避免了数据的重复存储,并且在访问虚基类成员时不会产生歧义。
  3. 与多重继承的不同点
    • 成员数量:多重继承在菱形继承结构中会导致最终派生类存在多份共同基类的成员;而虚继承通过特殊的机制,保证最终派生类中只有一份虚基类的成员。
    • 内存布局:多重继承下,派生类内存布局中会按照继承顺序依次存放从各个基类继承来的成员;虚继承的派生类内存布局会更复杂,会有额外的指针或偏移量来指向虚基类的共享实例,以确保只有一份虚基类成员。
    • 使用场景:多重继承适用于需要整合多个不同基类功能的场景,但要注意避免菱形继承问题;虚继承主要用于解决菱形继承带来的不良影响,在存在菱形继承结构时使用。