C++学習——クラスの継承

6635 ワード

公有継承(public)、プライベート継承(private)、保護継承(protected)の3つの継承方式が一般的です.
1.公有相続(public)
共通継承の特徴は、ベースクラスの共通メンバーと保護メンバーが派生クラスのメンバーとして使用される場合、それらは元の状態を維持し、ベースクラスのプライベートメンバーは依然としてプライベートであり、この派生クラスのサブクラスにアクセスできないことです.
2.プライベート継承(private)
プライベート継承の特徴は、ベースクラスの共有メンバーと保護メンバーが派生クラスのプライベートメンバーとして機能し、この派生クラスのサブクラスにアクセスできないことです.
3.保護継承(protected)
保護継承の特徴は、ベースクラスのすべての共有メンバーと保護メンバーが派生クラスの保護メンバーとなり、その派生クラスメンバー関数または友元にのみアクセスでき、ベースクラスのプライベートメンバーは依然としてプライベートであることです.
次の3つの異なる継承方法のベースクラスプロパティと派生クラスプロパティを示します.
 
public
protected
private
共有継承
public
protected
非表示
プライベート継承
private
private
非表示
保護継承
protected
protected
非表示
上図:1)ベースクラスメンバー対派生クラスは、共有および保護されたメンバーが表示され、プライベートメンバーは表示されません.
2)ベースクラスメンバー派生クラスのオブジェクト:ベースクラスのメンバーが派生クラスでどのようなタイプのメンバーになったかを見ます.たとえば、プライベート継承では、ベースクラスの共有メンバーとプライベートメンバーが派生クラスのプライベートメンバーになります.したがって、派生クラスのオブジェクトでは、ベースクラスの共有メンバーとプライベートメンバーは表示されません.
3つの異なる継承方式のメンバーの可視性の違いをさらに理解するために,3つの異なる角度から議論する.
公有継承方式について
(1)ベースクラスメンバーのオブジェクトの可視性:
パブリックメンバーが表示され、その他は表示されません.ここでは、保護メンバーはプライベートメンバーと同じです.
(2)派生クラスに対するベースクラスメンバーの可視性:
公開メンバーと保護メンバーは表示されますが、プライベートメンバーは表示されません.ここで保護メンバーは共有メンバーと同じです.
(3)派生クラスオブジェクトに対するベースクラスメンバーの可視性:
公開メンバーは表示され、他のメンバーは表示されません.
したがって、共通継承の場合、派生クラスのオブジェクトはベースクラスの共通メンバーにアクセスできます.派生クラスのメンバー関数は、ベースクラスの共有メンバーにアクセスし、メンバーを保護します.ここでは、派生クラスのオブジェクトと派生クラスのメンバー関数のベースクラスへのアクセスが異なることを明確に区別する必要があります.
プライベート継承の場合
(1)ベースクラスメンバーのオブジェクトの可視性:
公開メンバーは表示され、他のメンバーは表示されません.
(2)派生クラスに対するベースクラスメンバーの可視性:
パブリックメンバーと保護メンバーは表示され、プライベートメンバーは表示されません.
(3)派生クラスオブジェクトに対するベースクラスメンバーの可視性:
すべてのメンバーは表示されません.
したがって、プライベート継承では、ベースクラスのメンバーは直接派生クラスからのみアクセスでき、これ以上継承できません.
保護継承方式
この継承方式は私有継承方式の場合と同じである.両者の違いは、派生クラスのメンバーにとって、ベースクラスのメンバーに対して異なる可視性があることだけです.
上述した可視性、すなわちアクセス性.
アクセス性については別の言い方があります.このルールでは、派生クラスと呼ばれるオブジェクトがベースクラスにアクセスすることを水平アクセスと呼び、派生クラスの派生クラスがベースクラスにアクセスすることを垂直アクセスと呼ぶ.
このような例を見てみましょう.
 1 #include<iostream>

 2 using namespace std;

 3 //////////////////////////////////////////////////////////////////////////

 4 class A       //  

 5 {

 6 private:

 7     int privatedateA;

 8 protected:

 9     int protecteddateA;

10 public:

11     int publicdateA;

12 };

13 //////////////////////////////////////////////////////////////////////////

14 class B :public A      //  A    B(    )

15 {

16 public:

17     void funct()

18     {

19         int b;

20         b=privatedateA;   //error:                 

21         b=protecteddateA; //ok:                 

22         b=publicdateA;    //ok:                 

23     }

24 };

25 //////////////////////////////////////////////////////////////////////////

26 class C :private A  //  A    C(    )

27 {

28 public:

29     void funct()

30     {

31         int c;

32         c=privatedateA;    //error:                 

33         c=protecteddateA;  //ok:                 

34         c=publicdateA;     //ok:                 

35     }

36 };

37 //////////////////////////////////////////////////////////////////////////

38 class D :protected A   //  A    D(    )

39 {

40 public:

41     void funct()

42     {

43         int d;

44         d=privatedateA;   //error:                 

45         d=protecteddateA; //ok:                 

46         d=publicdateA;    //ok:                 

47     }

48 };

49 //////////////////////////////////////////////////////////////////////////

50 int main()

51 {

52     int a; 

53  

54     B objB;

55     a=objB.privatedateA;   //error:                 ,      

56     a=objB.protecteddateA; //error:                 ,      

57     a=objB.publicdateA;    //ok:                 ,     

58  

59     C objC;

60     a=objC.privatedateA;   //error:                 ,      

61     a=objC.protecteddateA; //error:                 ,      

62     a=objC.publicdateA;    //error:                 ,      

63  

64     D objD;

65     a=objD.privatedateA;   //error:                 ,      

66     a=objD.protecteddateA; //error:                 ,      

67     a=objD.publicdateA;    //error:                 ,      

68  

69     return 0;

70 }