c++保護メンバーと保護継承の詳細

11433 ワード

protectedはpublicやprivateと同様にメンバーのアクセス権を宣言するために使用されます.
protectedによって宣言されたメンバーは、「保護されたメンバー」または「保護されたメンバー」と略称されます.クラスのユーザーの観点から、保護メンバーはプライベートメンバーに等しい.ただし、プライベートメンバーとは異なり、保護メンバーは派生クラスのメンバー関数で参照できます.
ベース・クラスがプライベート・メンバーを宣言している場合、派生クラスはアクセスできません.派生クラスでアクセスできるようにするには、保護メンバーとして宣言する必要があります.クラスで保護メンバーが宣言されている場合は、クラスがベースクラスとして使用され、派生クラスでこれらのメンバーにアクセスする可能性があります.
派生クラスを定義するときにベースクラスの継承方式をprotectedと指定するものを保護継承と呼び、保護継承方式で確立された派生クラスを保護派生クラス(protected derived class)と呼び、そのベースクラスを保護されたベースクラス(protected base class)、簡単に保護ベースクラスと呼ぶ.
保護継承の特徴は、ベースクラスを保護する共通メンバーと保護メンバーが派生クラスで保護メンバーとなり、そのプライベートメンバーがベースクラスのプライベートであることです.すなわち,ベースクラスの既存の共通メンバーも保護し,クラス外に任意にアクセスさせない.
表11.3派生クラスにおけるベースクラスメンバーのアクセス属性
ベースクラスのメンバー
共通派生クラスでのアクセス属性
プライベート派生クラスでのアクセス属性
派生クラスの保護におけるアクセス属性
プライベートメンバー
アクセス不可
アクセス不可
アクセス不可
共通メンバー
共通
プライベート
ほご
メンバーの保護
ほご
プライベート
ほご
保護ベースクラスのすべてのメンバーは派生クラスで保護され、クラス外ではアクセスできません.共通メンバーと保護メンバーは派生クラスのメンバー関数でアクセスできます.
保護ベースクラスのすべてのメンバーは派生クラスで保護され、クラス外ではアクセスできません.共通メンバーと保護メンバーは派生クラスのメンバー関数でアクセスできます.
プライベート継承と保護継承(つまり、プライベート派生クラスと保護派生クラスでのアクセス属性を比較する)を比較すると、直接派生クラスでは、上記の2つの継承方式の役割は実際には同じであることがわかります.クラス外ではメンバーにアクセスできませんが、派生クラスではメンバー関数を使用してベースクラスの共通メンバーと保護メンバーにアクセスできます.しかし派生を続けると,新しい派生クラスでは2つの継承方式の役割が異なる.
たとえば、共通継承方式で新しい派生クラスが派生した場合、元のプライベートベースクラスのメンバーは、新しい派生クラスではアクセスできないメンバーとなり、派生クラス内でも外でもアクセスできませんが、元の保護ベースクラスの共通メンバーと保護メンバーは、新しい派生クラスでは保護メンバーとなり、新しい派生クラスのメンバー関数でアクセスできます.
ベースクラスのプライベート・メンバーが派生クラスによって継承され(プライベート・継承、公有継承、保護継承にかかわらず)、アクセス不可能なメンバーになり、派生クラスのすべてのメンバーがアクセスできないことを覚えておいてください.派生クラスでベースクラスの一部のメンバーを参照する必要がある場合は、privateではなくprotectedとしてベースクラスのメンバーを宣言する必要があります.
保護メンバーの使用が上手な場合は、クラスの階層でデータ共有とメンバー隠蔽の結合点を見つけることができます.一部のメンバーの隠蔽を実現し、継承を容易にし、コードの再利用と拡張を実現することができます.
以上の紹介で、以下の点がわかります.
1)派生クラスでは、メンバーには4つの異なるアクセス属性があります.
  • は共通で、派生クラス内と派生クラス外の両方にアクセスできます.
  • は保護されており、派生クラス内にアクセスでき、派生クラス外にアクセスできず、その次の階層の派生クラスにアクセスできる.
  • プライベートで、派生クラス内にアクセスでき、派生クラス外にアクセスできません.
  • はアクセスできません.派生クラス内と派生クラス外はアクセスできません.

  • 表11.4派生クラスのメンバーのアクセス属性
    派生クラスのメンバー
    派生クラス
    派生クラスの外部
    下位レベルの共通派生クラス
    派生クラスのアクセス属性が共通のメンバー
    できる
    できる
    できる
    派生クラスのアクセス属性は保護されたメンバーです
    できる
    いけません
    できる
    派生クラスのアクセス属性がプライベートなメンバー
    できる
    いけません
    いけません
    派生クラスでアクセスできないメンバー
    いけません
    いけません
    いけません
    説明する必要があるのは、次のとおりです.
  • ここに示すメンバーのアクセス属性とは、派生クラスで取得されたアクセス属性を指す.
  • 派生クラス外部とは、派生クラスオブジェクトを確立するモジュールにおいて、派生クラスの範囲外である.
  • この派生クラスが派生を続ける場合、異なる継承方式では、メンバーが取得するアクセス属性が異なり、次の階層の共通派生クラスにのみリストされます.プライベート継承または保護継承の場合、表11.3から答えを見つけることができます.

  • 2)クラスのメンバーが異なる役割ドメインで異なるアクセス属性を持っていることは明らかである.メンバーのアクセスプロパティには、どの役割ドメインにあるかを確認する前提があります.ある読者は「ベースクラスの共通メンバーは、派生クラスで保護され、それ自体が共通なのか、それとも保護されているのか」と尋ねた.これは、同じメンバーが異なる役割ドメインで示す異なる特徴であると言うべきである.例えば、学校の人事部門は全校の教師と学生の従業員の資料を掌握して、学校の指導者はいかなる人の資料を調べることができて、学校の部下の学部は全校の資料の中から本学部の教師と学生の従業員の資料を得ることができて、その他の部門のいかなる人の資料を調べることができません.張さんの資料を調べることができるかどうかは、一概には言えないが、その人の資料があなたに「訪問」されるかどうかを決めるには、あなたの身分を明らかにしなければならない.
    派生クラスを紹介する前に、クラスのメンバーはその属するクラスにのみ属し、他のクラスには関係なく、曖昧さは起こりません.派生クラスを紹介すると、メンバーの特徴がどの範囲で議論され、同じメンバーが異なる継承階層で異なる特徴を持つかという問題があります.この概念を説明するために、例えば、自動車の運転免許証は地域別に発行され、北京の運転免許証は北京市の範囲内で滞りなく開通し、地方に着いたら、いくつかの制限を受ける可能性があり、外国に着いたら無効になる.同じパイロットの異なる地域での権利は異なる.例えば、病院に行って患者を見舞い、病室に入って近くで患者を見舞い、話をすることを許可すれば、患者に対して深い人を知ることができます.ガラスのドアの窓の外だけを見回すことができれば、一定の距離の外で患者を見ることができて、患者の状況に対して大雑把な印象しかありません.病棟の廊下でテレビを通じて人の活動を見るシーンだけを許可すれば、もっと間接的だ.人々は異なる場合に同じ患者に対して、異なる情報を得たり、この患者の異なる場合における「可視性」が異なる.
    普段、ある種の公用メンバーはどうなのかという習慣がありますが、一般的に誤解を引き起こさない場合は可能です.ただし、メンバーのアクセスプロパティは共通で変更できないと勘違いしないでください.メンバーのアクセス属性を議論する際には、ベースクラスのメンバーaのように、ベースクラスでのアクセス属性が共通であり、プライベート派生クラスでのアクセス属性がプライベートである範囲について説明する必要があります.
    保護メンバーへのアクセス方法を一例で説明します.
    [例11.3]派生クラスで保護メンバーを参照する.
    1. #include
    2. #include
    3. using namespace std;
    4. class Student//
    5. {
    6. public:
    7. //
    8. void display( );
    9. protected:
    10. //
    11. int num;
    12. string name;
    13. char sex;
    14. };
    15. //
    16. void Student::display( )
    17. {
    18. cout<<"num: "<<num<<endl;
    19. cout<<"name: "<<name<<endl;
    20. cout<<"sex: "<<sex<<endl;
    21. }
    22. class Student1: protected
    23. Student // protected Student1
    24. {
    25. public:
    26. void display1( );//
    27. private:
    28. int age;//
    29. string addr;//
    30. };
    31. void Student1::display1( )//
    32. {
    33. cout<<"num: "<<num<<endl;// ,
    34. cout<<"name: "<<name<<endl;// ,
    35. cout<<"sex: "<<sex<<endl;// ,
    36. cout<<"age: "<<age<<endl;// ,
    37. cout<<"address: "<<addr<<endl; // ,
    38. }
    39. int main( )
    40. {
    41. Student1 stud1; //stud1 Student1
    42. stud1.display1( ); // ,display1
    43. stud1.num=10023; // ,
    44. return 0;
    45. }
    46. #include 
      #include 
      using namespace std;
      class Student//    
      {
      public:
         //      
         void display( );
      protected:
         //      
         int num;
         string name;
         char sex;
      };
      //        
      void Student::display( )
      {
         cout<

      。 ( ,num Student , , , stud1.num ), , , 。 , , 。

      : Student1 stud1 display1 num、name sex, ( stud1.num )。

      , , 。