【发布时间】:2012-10-13 13:01:39
【问题描述】:
考虑以下代码:
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();
}
};
};
我的问题是为什么我们可以从base::Base::Nested 访问base::Base 的受保护方法/属性,但不能从inherited::Base::Nested 访问inherited::Base 的相同方法/属性?
我唯一能想到的是base::Base 是base::Base::Nested 的一种全局范围,因此它们是可访问的。 inherited::Base 是inherited::Base::Nested 的一种全局范围,base::Base 的受保护成员不可访问。但是,公共继承不应该改变可见性范围,我不清楚无法访问的原因。
【问题讨论】:
-
你的思维方式很奇怪。继承::基础?无论如何,为了这个示例的目的,去掉 80% 的代码,制作 Base、BaseNested、Derived 和 DerivedNested 类,并去掉所有不能证明您的问题的函数。
-
请尽量避免代码中不必要的杂乱(命名空间、太多成员)并使其可编译(没有奇怪的未定义宏,没有丢失的包含)。否则是个好问题。
-
有什么理由认为这不是stackoverflow.com/questions/4672438/…的副本?
标签: c++ inheritance nested-class