18

您能否解释一下为什么以下代码可以编译并正常工作(在 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;
}
4

1 回答 1

12

从语言的角度来看,这并没有错(设计好不好是另外一回事)。

任何班级都可以选择向更广泛的受众公开它可以访问的内容。

原则上,您的示例与以下内容没有什么不同:

class B : private A {
public:
    void bar() { foo(); }
};

除了这里foo()是通过代理公开的。

你不能做的是相反的事情:公共派生类不能限制对可通过基类访问的东西的访问。

于 2012-12-18T13:21:40.073 回答