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 に答える