有人可以解释一下为什么(也就是说,“语言为什么会这样?”),以下代码在B::C::bar
的第二行会编译错误吗?
class A
{
public:
struct D
{
void call_foo (A &a)
{
a.foo ();
}
};
protected:
void foo () {}
};
class B : public A
{
struct C : public A::D
{
void bar (A &a, B &b)
{
b.foo (); // OK
a.foo (); // Error. Huh?
call_foo (a); // Ugly workaround
}
};
};
如果且仅当基础指针的类型正好是封闭类型(而不是某个父类型)时,似乎可以安全地在父类中使用受保护的方法。
这似乎有点奇怪。为什么语言会这样设计呢?