您能否解释一下为什么以下代码可以编译并且工作正常(在 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;
}
最佳答案
从语言的角度来看,这并没有什么问题(设计好不好是另外一回事)。
任何类(class)都可以选择向更广泛的受众公开它可以访问的内容。
原则上,您的示例与以下内容没有什么不同:
class B : private A {
public:
void bar() { foo(); }
};
除了这里 foo()
是通过代理暴露的。
您不能做的恰恰相反:公共(public)派生类不能限制对可通过基类访问的事物的访问。
关于c++ - 选择性继承 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933926/