假设我们有class A,B,C,D
,其中A是基数,B,C是介于两者之间,D是在钻石模型中导出的。
注意:
class B
在私密模式中继承了virtualy class A
,
class C
inherita virtualy 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
的实例时,会员会是什么?私人或受保护大声笑?
图2:
如果我们这样做会怎么样:
class B :
virtual public A // note public this time!
{
};
class C :
virtual protected A // same as before
{
};
我想member
在第二个例子中是公开的吗?
答案 0 :(得分: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 };
由于
W::f()
可通过C::f()
的公共路径B
使用,因此允许访问。 -end example ]
我认为我不需要添加任何其他内容,但另请参阅this defect report(已被关闭为“非缺陷”)。