您能否解释为什么以下代码编译并正常工作(在gcc-4.3.4上查看)。我认为选择性继承不能削弱甚至加强对成员/方法的访问。它不会破坏封装规则吗?
#include <iostream>
class A {
protected:
void foo() { std::cout << "foo" << std::endl; }
};
class B : private A {
public:
using A::foo; //foo() becomes public?!
};
int main() {
B b;
b.foo();
return 0;
}
答案 0 :(得分:12)
从语言的角度来看,这没有任何问题(好的设计是否是另一回事)。
任何班级都可以选择向更广泛的受众群体展示其有权访问的内容。
原则上,您的示例与:
没有什么不同class B : private A {
public:
void bar() { foo(); }
};
除了此处foo()
由代理公开。
你不能做的是相反的:公开派生的类不能限制对通过基类可访问的事物的访问。