为什么会这样编译:
class FooBase
{
protected:
void fooBase(void);
};
class Foo : public FooBase
{
public:
void foo(Foo& fooBar)
{
fooBar.fooBase();
}
};
但这不?
class FooBase
{
protected:
void fooBase(void);
};
class Foo : public FooBase
{
public:
void foo(FooBase& fooBar)
{
fooBar.fooBase();
}
};
一方面,C++ 授予对该类的所有实例的私有/受保护成员的访问权限,但另一方面,它不授予子类的所有实例对基类的受保护成员的访问权限。
这对我来说看起来相当不一致。
我已经测试了使用 VC++ 和 ideone.com 进行编译,并且都编译了第一个代码片段,但没有编译第二个代码片段。
When foo
收到一个FooBase
引用,编译器不知道参数是否是Foo
,所以它必须假设它不是。Foo
可以访问继承的受保护成员other Foo
objects,不是所有其他兄弟类。
考虑这段代码:
class FooSibling: public FooBase { };
FooSibling sib;
Foo f;
f.foo(sib); // calls sib.fooBase()!?
If Foo::foo
可以调用任意的受保护成员FooBase
后代,那么它可以调用受保护的方法FooSibling
,与没有直接关系Foo
。这不是受保护的访问应该如何工作的。
If Foo
需要访问所有受保护的成员FooBase
对象,不仅仅是那些已知的对象Foo
后裔,那么Foo
需要成为以下人的朋友FooBase
:
class FooBase
{
protected:
void fooBase(void);
friend class Foo;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)