选择性继承C ++

时间:2012-12-18 13:19:45

标签: c++ inheritance

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

1 个答案:

答案 0 :(得分:12)

从语言的角度来看,这没有任何问题(好的设计是否是另一回事)。

任何班级都可以选择向更广泛的受众群体展示其有权访问的内容。

原则上,您的示例与:

没有什么不同
class B : private A {
public:
    void bar() { foo(); }
};

除了此处foo()由代理公开。

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