选择性继承C++

Selective inheritance C++

本文关键字:C++ 继承 选择性      更新时间:2023-10-16

您能否解释一下为什么以下代码可以编译并且工作正常(在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 B : private A {
public:
    void bar() { foo(); }
};

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

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