c++繼承詳解:共有(public)繼承,私有繼承(private)繼承,保護(protected)繼承

公有繼承(public)繼承、私有繼承(private)、保護繼承(protected)是經常使用的三種繼承方式。ios

1.公有繼承(public)函數

  公有繼承的特色是基類的公有成員和保護成員做爲派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。spa

2.私有繼承(private)code

  私有繼承的特色是基類的公有成員和保護成員都做爲派生類的私有成員,而且不能被這個派生類的子類所訪問。對象

3.保護繼承blog

  保護繼承的特色是基類的全部公有成員和保護成員都成爲派生類的保護成員,而且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。繼承

三種不一樣繼承方式的基類特性和派生類特生io

  pulic protected private
公有繼承 pulic proctected 不可見
私有繼承 private private 不可見
保護繼承 protected protected

不可見table

在上圖中:class

  1.基類成員對派生類都是:共有和保護的成員是可見的,私有的成員是不可見的。

  2.基類成員對派生類的對象來講:要看基類的成員在派生類中變成了什麼類型的成員。如:私有繼承時,基類的公有成員和私有成員都變成了派生類中的私有成  員,所以對於派生類中的對象來講基類的公有成員和私有成員就是不可見的。爲了進一步理解三種不一樣的繼承方式在其成員的可見性方面的區別,下面從三種不  同角度進行討論。

對於公有繼承方式

  1.基類成員對其對象的可見性:公有成員可見,其餘不可見。這裏保護成員同於私有成員。

  2.基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見。這裏保護成員同於公有成員。

  3.基類成員對派生類對象的可見性:公有成員可見,其餘成員不可見。

  因此:在公有繼承時,派生類的對象能夠訪問基類中的公有成員;派生類的成員函數能夠訪問基類中的公有成員和保護成員。這裏,必定要區分清楚派生類的對  象和派生類中的成員函數對基類的訪問是不一樣的。

對於私有繼承方式

  1.基類成員對其對象的可見性:公有成員可見,其餘成員不可見

  2.基類成員函數對派生類的可見性:公有成員和保護成員是可見的,而私有成員是不可見的。

  3.基類成員對派生類對象的可見性:全部成員都是不可見的。

  因此:在私有繼承時,基類的成員只能由直接派生類訪問,而沒法向下繼承。

對於保護繼承方式

這種繼承方式與私有繼承方式的狀況相同。二者的區別僅在於對派生類的成員而言,而對於基類成員有不一樣的可見性。(可見性也就是可訪問性)。

關於可訪問性還有另一種說法。這種規則中,稱派生類的對象對基類訪問爲水平訪問,稱派生類的派生類對基類的訪問爲垂直訪問。

 

 1 #include<iostream>
 2 class A{
 3 private:
 4     int privatedataA;
 5 protected:
 6     int protecteddataA;
 7 public:
 8     int publicdataA;
 9 };
10 //基類A的派生類B(公有繼承)
11 class B :public A{
12 
13 public:
14     void funcA()
15     {
16         int b;
17         b = privatedataA;
18         //錯誤:基類中的私有成員在派生類中不可見
19         b = protecteddataA;
20         //正確:基類的保護成員在派生類中是保護成員
21         b = publicdataA;
22         //正確:基類的公共成員在派生類是公共成員
23     }
24 };
25 //基類A的派生類C 私有繼承
26 class C :private A{
27 
28 public:
29     void funcA()
30     {
31         int c;
32         c = privatedataA;
33         //錯誤:基類中的私有成員在派生類中不可見
34         c = protecteddataA;
35         //正確:基類的保護成員在派生類中是私有成員
36         c = publicdataA;
37         //正確:基類的公共成員在派生類是私有成員
38     }
39 };
40 //基類A的派生類D 保護繼承
41 class D :protected A{
42 public:
43     void funcA()
44     {
45         int d;
46         d = privatedataA;
47         //錯誤:基類中的私有成員在派生類中不可見
48         d = protecteddataA;
49         //正確:基類的保護成員在派生類中是保護成員
50         d = publicdataA;
51         //正確:基類的公共成員在派生類是保護成員
52     }
53 };
54 void main()
55 {
56     int value;
57     B objB;
58     value = objB.privatedataA;//錯誤:基類的私有成員在派生類不可見,對對象不可見
59     value = objB.protecteddataA;//錯誤:基類的保護成員在派生類中是保護成員,對對象不可見
60     value = objB.publicdataA;//錯誤:基類的公共成員在派生類中是公共成員,對對象可見
61 
62     C objC;
63     value = objC.privatedataA;//錯誤:基類的私有成員在派生類不可見,對對象不可見
64     value = objC.protecteddataA;//錯誤:基類的保護成員在派生類中是私有成員,對對象不可見
65     value = objC.publicdataA;//錯誤:基類的公共成員在派生類中是私有成員,對對象不可見
66 
67     D objD;
68     value = objD.privatedataA;//錯誤:基類的私有成員在派生類不可見,對對象不可見
69     value = objD.protecteddataA;//錯誤:基類的保護成員在派生類中是保護成員,對對象不可見
70     value = objD.publicdataA;//錯誤:基類的公共成員在派生類中是保護成員,對對象不可見
71     system("pause");
72 }