次のコードを検討してください。
namespace base {
class Base {
protected:
class Nested {
protected:
Base* base;
public:
Nested(Base* _base) : base( _base ){}
virtual void test() {
base->foo();
/*
* hmm.. we can use protected methods
*/
base->bar();
}
};
protected:
Nested* nested;
void bar(){}
public:
void foo(){}
virtual void test() {
nested = new Nested(this);
nested->test();
}
};
};
namespace inherited {
class Base : public base::Base {
public:
Base()
: base::Base() {}
protected:
class Nested : public base::Base::Nested {
public:
Nested( inherited::Base* base )
: base::Base::Nested( base ) {}
public:
virtual void test() {
base->foo();
/*
* hmm.. and now they are not accessible
*/
// base->bar();
}
};
public:
virtual void test() {
foo();
bar();
nested = new Nested(this);
nested->test();
}
};
};
私の質問は、 from の保護されたメソッド/プロパティにアクセスできるのに、 base::Base
frombase::Base::Nested
の同じメソッド/プロパティにアクセスできないのinherited::Base
はなぜinherited::Base::Nested
ですか?
私が推測できる唯一のことはbase::Base
、それが一種のグローバルスコープでbase::Base::Nested
あるため、アクセス可能であることです。inherited::Base
は一種のグローバル スコープでinherited::Base::Nested
あり、 の保護されたメンバーにbase::Base
はアクセスできません。ただし、パブリック継承は可視性の範囲を変更するべきではなく、アクセスできない理由は不明です。