访问基础子对象和虚拟说明符c ++
这个问题在这里已经有了答案:
类struct C : A, B {};
一个对象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
-和B
碱基的子对象c
看到相同的V
基子对象。 虚拟基础在继承层次结构中“共享”。
virtual
说明符与访问基本子对象无关,而与导出对象中基本子对象的数目无关。 即使基础不是虚拟的,您也可以访问基础子对象。 virtual
在这里解决钻石继承问题等其他问题