具有混合继承修饰符的钻石继承(受保护/私有/公共)

cod*_*ddy 4 c++ inheritance diamond-problem

假设我们有class A,B,C,DA在哪里,B,C在两者之间,D在钻石模型中得出.

注意:

class Bclass A私人模式下继承virtualy ,

class Cclass A保护模式下继承virtualy .

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;
}
Run Code Online (Sandbox Code Playgroud)

现在当我们制作class D成员的实例时呢?私人或受保护的哈哈?

图2:

如果我们这样做会怎么样:

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

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

};
Run Code Online (Sandbox Code Playgroud)

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

Xeo*_*Xeo 6

§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
};
Run Code Online (Sandbox Code Playgroud)

由于W::f()可以C::f()沿着公共路径通过B,因此允许访问.- 末端的例子 ]

我想我不需要添加任何其他内容,但也请参阅此缺陷报告(已被关闭为"非缺陷").