C++ 访问基子对象和虚拟说明符c++;
我试图理解基类中虚拟说明符的确切用途。正如c++14工作草案中所述,我们有: 对于指定的每个不同的基类,最 派生对象应包含该对象的单个基类子对象 类型 根据这段引文,我假设如果我们创建一个类C++ 访问基子对象和虚拟说明符c++;,c++,class,oop,C++,Class,Oop,我试图理解基类中虚拟说明符的确切用途。正如c++14工作草案中所述,我们有: 对于指定的每个不同的基类,最 派生对象应包含该对象的单个基类子对象 类型 根据这段引文,我假设如果我们创建一个类c的实例c,它是a和B的派生类,我们就隐式地创建了a和B的对象 问题:如何通过派生类的实例访问基类的实例?类的对象结构C:a,B{}包含两个基本子对象,一个是A类型,另一个是B类型。您可以“直接”访问它们: 您也可以显式地说static\u cast(c)和static\u cast(c),尽管这不是经常需要
c
的实例c
,它是a
和B
的派生类,我们就隐式地创建了a
和B
的对象
问题:如何通过派生类的实例访问基类的实例?类的对象
结构C:a,B{}
包含两个基本子对象,一个是A
类型,另一个是B
类型。您可以“直接”访问它们:
您也可以显式地说static\u cast(c)
和static\u cast(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
只有一个V
类型的基本子对象,而不是两个,并且A
-和B
-类型的V
基本子对象的V
基本子对象参见相同的V
基本子对象。虚拟基在继承层次结构中是“共享”的。virtual
说明符与访问基子对象无关,而是与派生对象中基子对象的数量有关。即使基础不是虚拟的,也可以访问基础子对象virtual
用于解决其他问题,如最后一个问题似乎与介绍无关。除非继承的方法是公共的,否则无法跨实例访问它们。
struct V {};
struct A : virtual V {};
struct B : virtual V {};
struct C : A, B {};