我试图了解基类中虚拟说明符的确切目的。如c ++ 14工作草案所述,我们有:
对于指定为virtual的每个不同的基类,最多 派生对象应包含单个基类子对象 类型。
从这个引用中我假设如果我们创建一个c
类的实例C
,它是A
和B
的派生类,我们就是&#39 ;隐式地重新创建A
和B
的对象。
问题:如何通过派生类的实例访问基类的实例?
答案 0 :(得分:0)
类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
基础子对象。虚拟基地是共享的#34;跨越继承层次结构。
答案 1 :(得分:0)
virtual
说明符与访问基础子对象无关,而与派生对象中的基础子对象数量无关。即使基础不是虚拟的,您也可以访问基础子对象。 virtual
可以解决其他问题,例如diamond inheritance problem