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

时间:2014-05-03 09:59:08

标签: c++ class oop

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

  

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

从这个引用中我假设如果我们创建一个c类的实例C,它是AB的派生类,我们就是&#39 ;隐式地重新创建AB的对象。

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

2 个答案:

答案 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