C++におけるprotectedアクセス権の問題

2281 ワード

今日はこんな言葉があることに気づいた.ベースクラスの保護メンバーは、派生クラスのメンバーにアクセスできます.2.派生クラスのメンバーは、派生クラスオブジェクトからのみベースクラスの保護メンバーにアクセスできます.派生クラスは、1つのベースクラスオブジェクトの保護されたメンバーにアクセスできません.
この2つの言葉はめまいがしますが、著者は派生クラスの中でのみ派生クラスオブジェクトを通じてベースクラスのprotectedメンバーにアクセスできることを表現したいと思っています.このようなコードを見てください.
class Base
{
public:
    Base();
private:
    void foo();
protected:
    int m;
};
class Derive : public Base
{
public:
    Derive();
};
Derive::Derive()
{
    this->m = 1;  //     m    
}

クラスのコードを使用:
Derive *d = new Derive();
std::cout<< d->m <<endl;  //       

3つのキーワードのアクセス範囲をまとめます:public:クラスメンバー関数、サブクラス関数、友元アクセス、クラスのオブジェクトアクセスも可能です.private:クラスメンバー関数および友元のみにアクセスでき、他のアクセスはできません.自分のクラスオブジェクトもできません.protected:クラスメンバー関数、サブクラス関数、およびメタにのみアクセスでき、他のアクセスはできません.自分のクラスオブジェクトもできません.
やはり上の2つのクラスで、publicとprivateだけを見て、次のコードを見ます.
    Base *b = new Base();
    b->test_pub();  //   
    b->foo();   //   
    std::cout<< b->m;   //   

protected継承とprivate継承は、アクセス権を低下させることができます.
private継承を使用すると、親のprotectedプロパティとpublicプロパティがサブクラスでprivateになりprotected継承を使用し、親のprotectedプロパティとpublicプロパティがサブクラスでprotectedになりpublic継承を使用し、親のprotectedプロパティとpublicプロパティは変更されません.