Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问基子对象和虚拟说明符c++;_C++_Class_Oop - Fatal编程技术网

C++ 访问基子对象和虚拟说明符c++;

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++14工作草案中所述,我们有:

对于指定的每个不同的基类,最 派生对象应包含该对象的单个基类子对象 类型

根据这段引文,我假设如果我们创建一个类
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 {};