为什么会编译:
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++ 为该类的所有实例授予对私有(private)/ protected 成员的访问权限,但另一方面,它不为子类的所有实例授予对基类 protected 成员的访问权限。 这在我看来相当不一致。
我已经测试过使用 VC++ 和 ideone.com 进行编译,并且都编译了第一个但不是第二个代码片段。
最佳答案
当 foo
接收到 FooBase
引用时,编译器不知道参数是否是 Foo
的后代,所以它必须假设不是。 Foo
可以访问其他 Foo
对象 的继承的 protected 成员,而不是所有其他同级类。
考虑这段代码:
class FooSibling: public FooBase { };
FooSibling sib;
Foo f;
f.foo(sib); // calls sib.fooBase()!?
如果Foo::foo
可以调用任意FooBase
后代的protected成员,那么它可以调用FooSibling
的protected方法,它有与 Foo
没有直接关系。这不是 protected 访问应该如何工作的方式。
如果 Foo
需要访问所有 FooBase
对象的 protected 成员,而不仅仅是那些也被称为 Foo
后代的成员,那么 Foo
需要成为 FooBase
的好友:
class FooBase
{
protected:
void fooBase(void);
friend class Foo;
};
关于c++ - 访问另一个子类中基类的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631777/