菱形继承(Diamond Inheritance)是一种多重继承的情况,其中派生类继承自两个间接基类,而这两个间接基类又继承自同一个基类,形成了一个菱形的继承关系。
A
/ \
B C
\ /
D
class A {
public:
int a;
};
class B : public A {
public:
int b;
};
class C : public A {
public:
int c;
};
class D : public B, public C {
public:
int d;
};
菱形继承会引入一些潜在的问题:
-
冗余的数据:由于类
D
继承自类B
和类C
,而它们都继承自类A
,所以类D
中会包含两份来自类A
的成员数据,造成了数据冗余。 -
二义性:由于类
D
同时继承自类B
和类C
,而这两个基类都有继承自类A
的成员,当在类D
中访问这些成员时,会产生二义性,编译器无法确定要使用哪个基类的成员。
虚继承:
为了解决菱形继承带来的问题,C++ 提供了虚继承(Virtual Inheritance)机制。通过使用虚继承,可以确保在菱形继承中只有一份共享的基类子对象,从而解决了数据冗余和二义性的问题。在上面的示例中,如果将类 B
和类 C
继承自类 A
的方式改为虚继承,可以使用 virtual
关键字实现:
class B : virtual public A {
public:
int b;
};
class C : virtual public A {
public:
int c;
};
确保了只有一份共享的基类子对象,从而避免了冗余的数据和二义性。