深入分析C++派生類中的保護(hù)成員繼承
protected 與 public 和 private 一樣是用來(lái)聲明成員的訪問權(quán)限的。由protected聲明的成員稱為“受保護(hù)的成員”,或簡(jiǎn)稱“保護(hù)成員”。從類的用戶角度來(lái)看,保護(hù)成員等價(jià)于私有成員。但有一點(diǎn)與私有成員不同,保護(hù)成員可以被派生類的成員函數(shù)引用。
如果基類聲明了私有成員,那么任何派生類都是不能訪問它們的,若希望在派生類中能訪問它們,應(yīng)當(dāng)把它們聲明為保護(hù)成員。如果在一個(gè)類中聲明了保護(hù)成員,就意味著該類可能要用作基類,在它的派生類中會(huì)訪問這些成員。
在定義一個(gè)派生類時(shí)將基類的繼承方式指定為protected的,稱為保護(hù)繼承,用保護(hù)繼承方式建立的派生類稱為保護(hù)派生類(protected derived class ), 其基類稱為受保護(hù)的基類(protected base class ),簡(jiǎn)稱保護(hù)基類。
保護(hù)繼承的特點(diǎn)是:保護(hù)基類的公用成員和保護(hù)成員在派生類中都成了保護(hù)成員,其私有成員仍為基類私有。也就是把基類原有的公用成員也保護(hù)起來(lái),不讓類外任意訪問。
保護(hù)基類的所有成員在派生類中都被保護(hù)起來(lái),類外不能訪問,其公用成員和保護(hù)成 員可以被其派生類的成員函數(shù)訪問。
保護(hù)基類的所有成員在派生類中都被保護(hù)起來(lái),類外不能訪問,其公用成員和保護(hù)成員可以被其派生類的成員函數(shù)訪問。
比較一下私有繼承和保護(hù)繼承(也就是比較在私有派生類中和在保護(hù)派生類中的訪問屬性), 可以發(fā)現(xiàn),在直接派生類中,以上兩種繼承方式的作用實(shí)際上是相同的:在類外不能訪問任何成員,而在派生類中可以通過成員函數(shù)訪問基類中的公用成員和保護(hù)成員。但是如果繼續(xù)派生,在新的派生類中,兩種繼承方式的作用就不同了。
例如,如果以公用繼承方式派生出一個(gè)新派生類,原來(lái)私有基類中的成員在新派生類中都成為不可訪問的成員,無(wú)論在派生類內(nèi)或外都不能訪問,而原來(lái)保護(hù)基類中的公用成員和保護(hù)成員在新派生類中為保護(hù)成員,可以被新派生類的成員函數(shù)訪問。
大家需要記?。夯惖乃接谐蓡T被派生類繼承(不管是私有繼承、公有繼承還是保護(hù)繼承)后變?yōu)椴豢稍L問的成員,派生類中的一切成員均無(wú)法訪問它們。如果需要在派生類中引用基類的某些成員,應(yīng)當(dāng)將基類的這些成員聲明為protected,而不要聲明為private。
如果善于利用保護(hù)成員,可以在類的層次結(jié)構(gòu)中找到數(shù)據(jù)共享與成員隱蔽之間的結(jié)合點(diǎn)。既可實(shí)現(xiàn)某些成員的隱蔽,又可方便地繼承,能實(shí)現(xiàn)代碼重用與擴(kuò)充。
通過以上的介紹,可以知道以下幾點(diǎn)。
1) 在派生類中,成員有4種不同的訪問屬性:
公用的,派生類內(nèi)和派生類外都可以訪問。
受保護(hù)的,派生類內(nèi)可以訪問,派生類外不能訪問,其下一層的派生類可以訪問。
私有的,派生類內(nèi)可以訪問,派生類外不能訪問。
不可訪問的,派生類內(nèi)和派生類外都不能訪問。
需要說(shuō)明的是:
這里所列出的成員的訪問屬性是指在派生類中所獲得的訪問屬性。
所謂在派生類外部,是指在建立派生類對(duì)象的模塊中,在派生類范圍之外。
如果本派生類繼續(xù)派生,則在不同的繼承方式下,成員所獲得的訪問屬性是不同的,在本表中只列出在下一層公用派生類中的情況,如果是私有繼承或保護(hù)繼承,大家可以從表11.3中找到答案。
2) 類的成員在不同作用域中有不同的訪問屬性,對(duì)這一點(diǎn)要十分清楚。一個(gè)成員的訪問屬性是有前提的,要看它在哪一個(gè)作用域中。有的讀者問:“一個(gè)基類的公用成 員,在派生類中變成保護(hù)的,究竟它本身是公用的還是保護(hù)的?”應(yīng)當(dāng)說(shuō):這是同一個(gè)成員在不同的作用域中所表現(xiàn)出的不同特征。例如,學(xué)校人事部門掌握了全校師生員工的資 料,學(xué)校的領(lǐng)導(dǎo)可以查閱任何人的材料,學(xué)校下屬的系只能從全校的資料中得到本系師生員工的資料,而不能查閱其他部門任何人的材料。如果你要問:能否查閱張某某的材料, 無(wú)法一概而論,必須查明你的身份,才能決定該人的材料能否被你“訪問”。
在未介紹派生類之前,類的成員只屬于其所屬的類,不涉及其他類,不會(huì)引起歧義。 在介紹派生類后,就存在一個(gè)問題:在哪個(gè)范圍內(nèi)討論成員的特征,同一個(gè)成員在不同 的繼承層次中有不同的特征。為了說(shuō)明這個(gè)概念,可以打個(gè)比方,汽車駕駛證是按地區(qū)核發(fā)的,北京的駕駛證在北京市范圍內(nèi)暢通無(wú)阻,如果到了外地,可能會(huì)受到某些限制,到了外國(guó)就無(wú)效了。同一個(gè)駕駛員在不同地區(qū)的權(quán)利是不同的。又譬如,到 探視病人,如 果允許你進(jìn)人病房近距離地看望病人并與之交談,則可對(duì)病人了解比較深人;如果只允許你在玻璃門窗外探視,在一定距離外看到病人,只能對(duì)病人狀況有粗略的印象;如果只允許在病區(qū)的走廊里通過電視看病人活動(dòng)的片段鏡頭,那就更間接了。人們?cè)诓煌膱?chǎng)合下對(duì)同一個(gè)病人,得到不同的信息,或者說(shuō),這個(gè)病人在不同的場(chǎng)合下的“可見性”不同。
平常,人們常習(xí)慣說(shuō)某類的公用成員如何如何,這在一般不致引起誤解的情況下是可以的。但是決不要誤認(rèn)為該成員的訪問屬性只能是公用的而不能改變。在討論成員的訪問屬性時(shí),一定要說(shuō)明是對(duì)什么范圍而言的,如基類的成員a,在基類中的訪問屬性是公用的,在私有派生類中的訪問屬性是私有的。
下面通過一個(gè)例子說(shuō)明怎樣訪問保護(hù)成員。
[例] 在派生類中引用保護(hù)成員。
#include <iostream> #include <string> using namespace std; class Student//聲明基類 { public: //基類公用成員 void display( ); protected: //基類保護(hù)成員 int num; string name; char sex; }; //定義基類成員函數(shù) void Student::display( ) { cout<<"num: "<<num<<endl; cout<<"name: "<<name<<endl; cout<<"sex: "<<sex<<endl; } class Student1: protected Student //用protected方式聲明派生類Student1 { public: void display1( );//派生類公用成員函數(shù) private: int age;//派生類私有數(shù)據(jù)成員 string addr;//派生類私有數(shù)據(jù)成員 }; void Student1::display1( )//定義派生類公用成員函數(shù) { cout<<"num: "<<num<<endl;//引用基類的保護(hù)成員,合法 cout<<"name: "<<name<<endl;//引用基類的保護(hù)成員,合法 cout<<"sex: "<<sex<<endl;//引用基類的保護(hù)成員,合法 cout<<"age: "<<age<<endl;//引用派生類的私有成員,合法 cout<<"address: "<<addr<<endl; //引用派生類的私有成員,合法 } int main( ) { Student1 stud1; //stud1是派生類Student1類的對(duì)象 stud1.display1( ); //合法,display1是派生類中的公用成員函數(shù) stud1.num=10023; //錯(cuò)誤,外界不能訪問保護(hù)成員 return 0; }
在派生類的成員函數(shù)中引用基類的保護(hù)成員是合法的。基類的保護(hù)成員對(duì)派生類的外界來(lái)說(shuō)是不可訪問的(例如,num是基類Student中的保護(hù)成員,由于派生類是保護(hù)繼承,因此它在派生類中仍然是受保護(hù)的,外界不能用stud1.num來(lái)引用它),但在派生類內(nèi),它相當(dāng)于私有成員,可以通過派生類的成員函數(shù)訪問??梢钥吹?,保護(hù)成員和私有成員不同之處,在于把保護(hù)成員的訪問范圍擴(kuò)展到派生類中。
注意:在程序中通過派生類Student1的對(duì)象stud1的公用成員函數(shù)display1去訪問基類的保護(hù)成員num、name和sex,不要誤認(rèn)為可以通過派生類對(duì)象名去訪問基類的保護(hù) 成員(如stud1.num是錯(cuò)誤的)。
私有繼承和保護(hù)繼承方式在使用時(shí)需要十分小心,很容易搞錯(cuò),一般不常用,本教程后面的例子主要介紹公用繼承方式。
上一篇:c++統(tǒng)計(jì)文件中字符個(gè)數(shù)代碼匯總
欄 目:C語(yǔ)言
下一篇:C++的get()函數(shù)與getline()函數(shù)使用詳解
本文標(biāo)題:深入分析C++派生類中的保護(hù)成員繼承
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2682.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10基于C程序啟動(dòng)代碼的深入分析


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法