struct C : A, B {}; 类的对象包含两个基本子对象,一个是 A 类型,一个是 B 类型。您可以“直接”访问它们:
void foo(A &);
void bar(B &);
C c;
foo(c); // accesses the A-subobject
bar(c); // accesses the B-subobject
您也可以明确地说static_cast<A&>(c) 和static_cast<B&>(c),尽管这并不经常需要。不过,有时您需要消除名称的歧义:
struct A { void f(); };
struct B { void f(); };
struct C : A, B { void f(); };
C c;
c.f(); // calls the member "f" of C
c.A::f(); // calls the member "f" of the A-base subobject of c
c.B::f(); // calls the member "f" of the B-base subobject of c
所有这一切都与虚拟继承的概念没有真正的关系,它说只有相关的基础子对象,即使它是通过多个不同的继承来引用的:
struct V {};
struct A : virtual V {};
struct B : virtual V {};
struct C : A, B {};
在最后一个示例中,对象 C c 只有 一个 类型为 V 的基本子对象,而不是两个,以及 V-A 和 @ 的基本子对象987654333@-c 的基本子对象参见 same V 基本子对象。虚拟基础在继承层次结构中“共享”。