国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++繼承:公有,私有,保護

2019-11-09 19:09:45
字體:
來源:轉載
供稿:網友

轉:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html

有繼承(public)、私有繼承(PRivate)、保護繼承(protected)是常用的三種繼承方式。

1. 公有繼承(public)

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

2. 私有繼承(private)

私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,并且不能被這個派生類的子類所訪問。

3. 保護繼承(protected)

保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,并且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。

下面列出三種不同的繼承方式的基類特性和派生類特性。

 publicprotectedprivate
公有繼承publicprotected不可見
私有繼承privateprivate不可見
保護繼承protectedprotected不可見

在上圖中:1)基類成員對派生類都是:公有和保護的成員是可見的,私有的的成員是不可見的。

                   2)基類成員對派生類的對象來說:要看基類的成員在派生類中變成了什么類型的成員。如:私有繼承時,基類的公有成員和私有成員都變成了派生類中的私有成員,因此對于派生類中的對象來說基類的公有成員和私有成員就是不可見的。

  為了進一步理解三種不同的繼承方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。

對于公有繼承方式

(1) 基類成員對其對象的可見性:

公有成員可見,其他不可見。這里保護成員同于私有成員。

(2) 基類成員對派生類的可見性:

公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員。

(3) 基類成員對派生類對象的可見性:

公有成員可見,其他成員不可見。

所以,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這里,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。

對于私有繼承方式

(1) 基類成員對其對象的可見性:

公有成員可見,其他成員不可見。

(2) 基類成員對派生類的可見性:

公有成員和保護成員是可見的,而私有成員是不可見的。

(3) 基類成員對派生類對象的可見性:

所有成員都是不可見的。

所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。

對于保護繼承方式

這種繼承方式與私有繼承方式的情況相同。兩者的區別僅在于對派生類的成員而言,對基類成員有不同的可見性。

上述所說的可見性也就是可訪問性。

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

看看這樣的例子:

#include<iostream>using namespace std;//////////////////////////////////////////////////////////////////////////class A      //父類{private:    int privatedateA;protected:    int protecteddateA;public:    int publicdateA;};//////////////////////////////////////////////////////////////////////////class B :public A     //基類A的派生類B(公有繼承){public:    void funct()    {        int b;        b=privatedateA;  //error:基類中私有成員在派生類中是不可見的        b=protecteddateA;//ok:基類的保護成員在派生類中為保護成員        b=publicdateA;   //ok:基類的公共成員在派生類中為公共成員    }};//////////////////////////////////////////////////////////////////////////class C :private //基類A的派生類C(私有繼承){public:    void funct()    {        int c;        c=privatedateA;   //error:基類中私有成員在派生類中是不可見的        c=protecteddateA; //ok:基類的保護成員在派生類中為私有成員        c=publicdateA;    //ok:基類的公共成員在派生類中為私有成員    }};//////////////////////////////////////////////////////////////////////////class D :protected A  //基類A的派生類D(保護繼承){public:    void funct()    {        int d;        d=privatedateA;  //error:基類中私有成員在派生類中是不可見的        d=protecteddateA;//ok:基類的保護成員在派生類中為保護成員        d=publicdateA;   //ok:基類的公共成員在派生類中為保護成員    }};//////////////////////////////////////////////////////////////////////////int main(){    int a;     B objB;    a=objB.privatedateA;  //error:基類中私有成員在派生類中是不可見的,對對象不可見    a=objB.protecteddateA;//error:基類的保護成員在派生類中為保護成員,對對象不可見    a=objB.publicdateA;   //ok:基類的公共成員在派生類中為公共成員,對對象可見     C objC;    a=objC.privatedateA;  //error:基類中私有成員在派生類中是不可見的,對對象不可見    a=objC.protecteddateA;//error:基類的保護成員在派生類中為私有成員,對對象不可見    a=objC.publicdateA;   //error:基類的公共成員在派生類中為私有成員,對對象不可見     D objD;    a=objD.privatedateA;  //error:基類中私有成員在派生類中是不可見的,對對象不可見    a=objD.protecteddateA;//error:基類的保護成員在派生類中為保護成員,對對象不可見    a=objD.publicdateA;   //error:基類的公共成員在派生類中為保護成員,對對象不可見     return 0;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 寿光市| 建水县| 抚远县| 万载县| 仲巴县| 乐昌市| 长子县| 浦城县| 凤台县| 慈溪市| 内丘县| 织金县| 汉川市| 民乐县| 民勤县| 平和县| 那坡县| 大渡口区| 澎湖县| 喀喇沁旗| 板桥市| 临朐县| 呼和浩特市| 萍乡市| 调兵山市| 汉阴县| 保德县| 修武县| 抚顺县| 佛冈县| 遵义县| 龙江县| 荃湾区| 交城县| 尖扎县| 秭归县| 秦安县| 西宁市| 措美县| 循化| 清水县|