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在第二个例子中是公开的吗?
§11.6 Multiple access [class.paths]
如果通过多重继承图可以通过多个路径访问名称,则访问权限是提供大多数访问权限的路径.[ 例如:
Run Code Online (Sandbox Code Playgroud)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,因此允许访问.- 末端的例子 ]
我想我不需要添加任何其他内容,但也请参阅此缺陷报告(已被关闭为"非缺陷").
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |