4

假设我们有class A,B,C,DA 是基础,B,C 介于两者之间,D 是在钻石模型中派生的。

笔记:

class Bclass A私有模式继承 virtualy ,

class Cclass A保护模式下继承虚拟。

class A
{
public:
    int member;  // note this member
};
class B :
    virtual private A // note private 
{

};
class C :
    virtual protected A // note protected
{

};
class D :
    public B, // doesn't metter public or whatever here
    public C
{

};

int main()
{
    D test;
    test.member = 0; // WHAT IS member? protected or private member?
    cin.ignore();
    return 0;
}

现在当我们做一个成员的实例时,class D那会是什么?私人或受保护的大声笑?

图二:

如果我们这样做会怎样:

class B :
    virtual public A // note public this time!
{

};
class C :
    virtual protected A // same as before
{

};

我想member在第二个例子中会是公开的,是吗?

4

1 回答 1

7

§11.6 Multiple access [class.paths]

如果一个名称可以通过多重继承图通过多条路径到达,则访问权是提供最多访问权的路径的访问权。[示例:

class W { public: void f(); };
class A : private virtual W { };
class B : public virtual W { };
class C : public A, public B {
   void f() { W::f(); } // OK
};

由于W::f()可以C::f()通过公共路径B访问,因此允许访问。—结束示例]

我想我不需要添加任何其他内容,但另请参阅此缺陷报告(已关闭为“不是缺陷”)。

于 2012-01-22T00:57:51.570 回答