MST

星途 面试题库

面试题:C++类多继承中的菱形继承问题

请阐述C++多继承中菱形继承的概念,并说明它会引发什么问题,如何解决这些问题?
43.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

菱形继承概念

菱形继承是指在多继承体系中,一个派生类从两个或多个基类继承,而这些基类又共同继承自同一个基类,从而形成一个菱形的继承结构。例如:

class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

这里A是顶层基类,BC继承自AD又同时继承BC,形成菱形结构。

引发的问题

  1. 数据冗余:由于D类从BC间接继承了A类的成员,A类的成员在D类对象中会存在两份副本,造成内存浪费。
  2. 歧义问题:当D类对象访问A类成员时,会出现歧义,编译器不知道应该使用从B继承过来的A类成员还是从C继承过来的A类成员。例如:
D d;
d.fun(); // 如果A类中有fun函数,这里会出现歧义

解决方法

使用虚继承。在继承关系中,让BC以虚继承的方式继承A,这样在D类对象中只会存在一份A类的成员。修改上述代码如下:

class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

虚继承保证无论经过多少次继承,派生类对象中只会有一份共享的虚基类子对象,解决了数据冗余和歧义问题。