C++Access Control Modifiers/C++アクセス制御子


詳細
I saw many debates on the web about the access control modifier. And I also have some confusion although I have never used other derive method than "public". And I believe only the compiler will tell you the truth:
ネット上でC++アクセス制御子に関する質問がたくさんあるのを見て、自分も少しぼんやりしています.自分は実際の工事でpublic以外の継承を使ったことがありませんが.どんなに多くの議論があっても、コンパイラに事実を教えてもらうほうがいいです.

// NOTICE: the lines commented out below can get compiled!
class B {
    public:
        void public_foo() {
            cout << "public_foo" << endl;
        }
    protected:
        void protected_foo() {
            cout << "protected_foo" << endl;
        }
    private:
        void private_foo() {
            cout << "private_foo" << endl;
        }
};

class D1 : public B {
    public:
        void test () {
            B::public_foo();
            B::protected_foo();
            // B::private_foo();
        }
};

class D2 : protected B {
    public:
        void test () {
            B::public_foo();
            B::protected_foo();
            // B::private_foo();
        }
};

class D3 : private B {
    public:
        void test () {
            B::public_foo();
            B::protected_foo();
            // B::private_foo();
        }
};

class DD1 : public D1 {
    public:
        void test_inherits () {
            B::public_foo();
            B::protected_foo();
            // B::private_foo();
        }
};

class DD2 : public D2 {
    public:
        void test_inherits () {
            B::public_foo();
            B::protected_foo();
            // B::private_foo();
        }
};

class DD3 : public D3 {
    public:
        void test_inherits () {
            // B::public_foo();
            // B::protected_foo();
            // B::private_foo();
        }
};

int main(int argc, const char *argv[])
{
    DD1 dd1;
    dd1.public_foo();
    // you can't change the originally protected to public
    // with public inheritance
    // dd1.protected_foo();
    // nor the private ones
    // dd1.private_foo();

    DD2 dd2;
    // but you can change a public to protected
    // dd2.public_foo();

    DD3 dd3;
    // DD3 has everthing tagged with private
    // you have nothing to do with it
    
    return 0;
}

So:
  • the public/protected/private modifier for field or method declaration controls the member's access in its derived class.
  • the public/protected/private modifier for inheriting modifies the access defined by the above rule to the modifier you used here.
  • the modification made by the above rule only happens if the it makes the member less accessible

  • 結論:
  • public/protected/privateがフィールドまたはメソッドの宣言に使用されるときに制御されるのは、そのサブクラスにおけるメンバーのアクセス権
  • public/protected/privateが関係を継承するために使用されるときに、この宣言のアクセス権を変更することができます.ここで指定した修飾子
  • の変更は、この変更によってメンバーのアクセス権が「より小さく」なる場合にのみ行われます.
  • が発生します