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

这个问题在这里已经有了答案:

  • 在C ++中,什么是虚拟基类? 11个答案

  • struct C : A, B {};一个对象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基子对象。 虚拟基础在继承层次结构中“共享”。


    virtual说明符与访问基本子对象无关,而与导出对象中基本子对象的数目无关。 即使基础不是虚拟的,您也可以访问基础子对象。 virtual在这里解决钻石继承问题等其他问题

    链接地址: http://www.djcxy.com/p/78941.html

    上一篇: Acessing to a base subobject and virtual specifier c++

    下一篇: Inheriting constructors and virtual base classes