您似乎对“多重继承”的含义有些混淆?
当“B 继承自 A,A 继承自 O”时,多重继承不是。这只是一个简单的继承层次结构——这是 C++、Java 和 C# 的一个特性。
在上面的例子中,我们说B从A继承直接,从O继承间接。B从A继承(非私有)成员,以及间接地,O 的(非私有)成员。
C++ 还支持真正的多重继承,有时可以称为“混合继承”:多重继承的一个例子是
class A : public O {};
class B : A, O {};
这里 B 直接继承自 O,也直接继承自 A -- 在这种情况下 两个副本 O 的成员存在于 B 中,并且要访问的成员来自 O 的 B,您需要指定您想要哪些副本:
例如b.O::omember; 或 b.A::omember;
对于大型 C++ 类框架,当您使用多重继承时,您通常会在派生类中获得不需要的基类副本。为了解决这个问题,C++ 提供了虚拟继承,它强制只继承虚拟基类的一个副本:下面的示例应该清楚地说明这一点(或者让它更加混乱!)
// Note, a struct in C++ is simply a class with everything public
struct O { int omember; };
struct A1 : O {};
struct B1 : O, A1 {};
struct A2 : virtual O {};
struct B2 : virtual O, A2 {};
B1 b1;
B2 b2;
// There are two 'omember's in b1
b1.omember; // Compiler error - ambiguous
b1.A1::omember = 1;
b1.O::omember = 2;
// There's only one 'omember' in b2, so all the following three lines
// all set the same member
b2.A2::omember = 1;
b2.O::omember = 2;
b2.omember = 3;