次のコードを検討してください。
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::Basefrombase::Base::Nestedの同じメソッド/プロパティにアクセスできないのinherited::Baseはなぜinherited::Base::Nestedですか?
私が推測できる唯一のことはbase::Base、それが一種のグローバルスコープでbase::Base::Nestedあるため、アクセス可能であることです。inherited::Baseは一種のグローバル スコープでinherited::Base::Nestedあり、 の保護されたメンバーにbase::Baseはアクセスできません。ただし、パブリック継承は可視性の範囲を変更するべきではなく、アクセスできない理由は不明です。