带有混合继承修饰符(protected/private/public)的钻石继承

Diamond inheritance with mixed inheritance modifers (protected / private / public)

本文关键字:继承 private 钻石 public protected 混合      更新时间:2023-10-16

假设我们有class A,B,C,D,其中A是基底,B,C介于两者之间,D是在钻石模型中导出的。

注意:

class B私有模式下虚拟继承class A

class C保护模式下继承了一个虚拟class 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的实例时,成员将是什么?私人还是受保护的lol?

图2:

如果我们这样做怎么办:

class B :
    virtual public A // note public this time!
{
};
class C :
    virtual protected A // same as before
{
};

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

§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()在通过B的公共路径上可用于C::f(),因此允许访问-结束示例]

我想我不需要添加任何其他内容,但也可以看到这个缺陷报告(它被关闭为"不是缺陷")。