【问题标题】:Acessing to a base subobject and virtual specifier c++ [duplicate]访问基本子对象和虚拟说明符c ++ [重复]
【发布时间】:2014-05-03 09:59:08
【问题描述】:

我试图了解基类中虚拟说明符的确切用途。正如 c++14 工作草案中所说,我们有:

对于每个指定为虚拟的不同基类,最 派生对象应包含该对象的单个基类子对象 输入。

从这句话中,我假设如果我们创建一个实例 c 的类 CAB 的派生类,我们将创建 A 和 @987654326 的对象@ 隐含地。

问题:如何通过派生类的实例访问基类的实例?

【问题讨论】:

  • 最后一个问题似乎与介绍无关。
  • 你不能跨实例访问继承的方法,除非它们是公共的。

标签: c++ class oop


【解决方案1】:

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 基本子对象。虚拟基础在继承层次结构中“共享”。

【讨论】:

    【解决方案2】:

    virtual 说明符与访问基本子对象无关,而是派生对象中基本子对象的数量。即使基础不是虚拟的,您也可以访问基础子对象。 virtual 是来解决其他问题的,比如diamond inheritance problem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2014-09-09
      • 2014-11-03
      • 2012-04-09
      • 2017-09-17
      相关资源
      最近更新 更多