最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入分析C++派生類中的保護成員繼承

 更新時間:2015年09月21日 17:49:34   投稿:goldensun  
這篇文章主要介紹了C++派生類中的保護成員繼承,深入對C++面向對象編程的繼承機制進行了解析,需要的朋友可以參考下

protected 與 public 和 private 一樣是用來聲明成員的訪問權限的。由protected聲明的成員稱為“受保護的成員”,或簡稱“保護成員”。從類的用戶角度來看,保護成員等價于私有成員。但有一點與私有成員不同,保護成員可以被派生類的成員函數(shù)引用。

如果基類聲明了私有成員,那么任何派生類都是不能訪問它們的,若希望在派生類中能訪問它們,應當把它們聲明為保護成員。如果在一個類中聲明了保護成員,就意味著該類可能要用作基類,在它的派生類中會訪問這些成員。

在定義一個派生類時將基類的繼承方式指定為protected的,稱為保護繼承,用保護繼承方式建立的派生類稱為保護派生類(protected derived class ), 其基類稱為受保護的基類(protected base class ),簡稱保護基類。

保護繼承的特點是:保護基類的公用成員和保護成員在派生類中都成了保護成員,其私有成員仍為基類私有。也就是把基類原有的公用成員也保護起來,不讓類外任意訪問。

保護基類的所有成員在派生類中都被保護起來,類外不能訪問,其公用成員和保護成 員可以被其派生類的成員函數(shù)訪問。

保護基類的所有成員在派生類中都被保護起來,類外不能訪問,其公用成員和保護成員可以被其派生類的成員函數(shù)訪問。

比較一下私有繼承和保護繼承(也就是比較在私有派生類中和在保護派生類中的訪問屬性), 可以發(fā)現(xiàn),在直接派生類中,以上兩種繼承方式的作用實際上是相同的:在類外不能訪問任何成員,而在派生類中可以通過成員函數(shù)訪問基類中的公用成員和保護成員。但是如果繼續(xù)派生,在新的派生類中,兩種繼承方式的作用就不同了。

例如,如果以公用繼承方式派生出一個新派生類,原來私有基類中的成員在新派生類中都成為不可訪問的成員,無論在派生類內或外都不能訪問,而原來保護基類中的公用成員和保護成員在新派生類中為保護成員,可以被新派生類的成員函數(shù)訪問。

大家需要記?。夯惖乃接谐蓡T被派生類繼承(不管是私有繼承、公有繼承還是保護繼承)后變?yōu)椴豢稍L問的成員,派生類中的一切成員均無法訪問它們。如果需要在派生類中引用基類的某些成員,應當將基類的這些成員聲明為protected,而不要聲明為private。

如果善于利用保護成員,可以在類的層次結構中找到數(shù)據(jù)共享與成員隱蔽之間的結合點。既可實現(xiàn)某些成員的隱蔽,又可方便地繼承,能實現(xiàn)代碼重用與擴充。

通過以上的介紹,可以知道以下幾點。

1) 在派生類中,成員有4種不同的訪問屬性:
公用的,派生類內和派生類外都可以訪問。
受保護的,派生類內可以訪問,派生類外不能訪問,其下一層的派生類可以訪問。
私有的,派生類內可以訪問,派生類外不能訪問。
不可訪問的,派生類內和派生類外都不能訪問。

需要說明的是:
這里所列出的成員的訪問屬性是指在派生類中所獲得的訪問屬性。
所謂在派生類外部,是指在建立派生類對象的模塊中,在派生類范圍之外。
如果本派生類繼續(xù)派生,則在不同的繼承方式下,成員所獲得的訪問屬性是不同的,在本表中只列出在下一層公用派生類中的情況,如果是私有繼承或保護繼承,大家可以從表11.3中找到答案。

2) 類的成員在不同作用域中有不同的訪問屬性,對這一點要十分清楚。一個成員的訪問屬性是有前提的,要看它在哪一個作用域中。有的讀者問:“一個基類的公用成 員,在派生類中變成保護的,究竟它本身是公用的還是保護的?”應當說:這是同一個成員在不同的作用域中所表現(xiàn)出的不同特征。例如,學校人事部門掌握了全校師生員工的資 料,學校的領導可以查閱任何人的材料,學校下屬的系只能從全校的資料中得到本系師生員工的資料,而不能查閱其他部門任何人的材料。如果你要問:能否查閱張某某的材料, 無法一概而論,必須查明你的身份,才能決定該人的材料能否被你“訪問”。

在未介紹派生類之前,類的成員只屬于其所屬的類,不涉及其他類,不會引起歧義。 在介紹派生類后,就存在一個問題:在哪個范圍內討論成員的特征,同一個成員在不同 的繼承層次中有不同的特征。為了說明這個概念,可以打個比方,汽車駕駛證是按地區(qū)核發(fā)的,北京的駕駛證在北京市范圍內暢通無阻,如果到了外地,可能會受到某些限制,到了外國就無效了。同一個駕駛員在不同地區(qū)的權利是不同的。又譬如,到醫(yī)院探視病人,如 果允許你進人病房近距離地看望病人并與之交談,則可對病人了解比較深人;如果只允許你在玻璃門窗外探視,在一定距離外看到病人,只能對病人狀況有粗略的印象;如果只允許在病區(qū)的走廊里通過電視看病人活動的片段鏡頭,那就更間接了。人們在不同的場合下對同一個病人,得到不同的信息,或者說,這個病人在不同的場合下的“可見性”不同。

平常,人們常習慣說某類的公用成員如何如何,這在一般不致引起誤解的情況下是可以的。但是決不要誤認為該成員的訪問屬性只能是公用的而不能改變。在討論成員的訪問屬性時,一定要說明是對什么范圍而言的,如基類的成員a,在基類中的訪問屬性是公用的,在私有派生類中的訪問屬性是私有的。

下面通過一個例子說明怎樣訪問保護成員。

[例] 在派生類中引用保護成員。

#include <iostream>
#include <string>
using namespace std;
class Student//聲明基類
{
public:
  //基類公用成員
  void display( );
protected:
  //基類保護成員
  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;//引用基類的保護成員,合法
  cout<<"name: "<<name<<endl;//引用基類的保護成員,合法
  cout<<"sex: "<<sex<<endl;//引用基類的保護成員,合法
  cout<<"age: "<<age<<endl;//引用派生類的私有成員,合法
  cout<<"address: "<<addr<<endl; //引用派生類的私有成員,合法
}
int main( )
{
  Student1 stud1; //stud1是派生類Student1類的對象
  stud1.display1( ); //合法,display1是派生類中的公用成員函數(shù)
  stud1.num=10023; //錯誤,外界不能訪問保護成員
  return 0;
}

在派生類的成員函數(shù)中引用基類的保護成員是合法的?;惖谋Wo成員對派生類的外界來說是不可訪問的(例如,num是基類Student中的保護成員,由于派生類是保護繼承,因此它在派生類中仍然是受保護的,外界不能用stud1.num來引用它),但在派生類內,它相當于私有成員,可以通過派生類的成員函數(shù)訪問??梢钥吹?,保護成員和私有成員不同之處,在于把保護成員的訪問范圍擴展到派生類中。

注意:在程序中通過派生類Student1的對象stud1的公用成員函數(shù)display1去訪問基類的保護成員num、name和sex,不要誤認為可以通過派生類對象名去訪問基類的保護 成員(如stud1.num是錯誤的)。

私有繼承和保護繼承方式在使用時需要十分小心,很容易搞錯,一般不常用,本教程后面的例子主要介紹公用繼承方式。

相關文章

  • Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例

    Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例

    下面小編就為大家?guī)硪黄猄ublime Text 3 實現(xiàn)C++代碼的編譯和運行示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • CMake自動管理C/C++項目的實現(xiàn)

    CMake自動管理C/C++項目的實現(xiàn)

    CMake是一個強大的構建系統(tǒng),用于跨平臺管理C/C++項目的編譯過程,本文主要介紹了CMake自動管理C/C++項目的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實現(xiàn)C語言功能強大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C語言strlen和sizeof在數(shù)組中的使用詳解

    C語言strlen和sizeof在數(shù)組中的使用詳解

    對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質區(qū)別
    2021-10-10
  • C語言實現(xiàn)簡單學生成績管理系統(tǒng)

    C語言實現(xiàn)簡單學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單學生成績管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 如何在TC2.0中調用匯編程序

    如何在TC2.0中調用匯編程序

    本篇文章介紹了,如何在TC2.0中調用匯編程序的解決方法。需要的朋友參考下
    2013-05-05
  • Qt實現(xiàn)生成指定范圍內隨機數(shù)與隨機字符串

    Qt實現(xiàn)生成指定范圍內隨機數(shù)與隨機字符串

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)生成指定范圍內隨機數(shù)與隨機字符串,文中的示例代碼簡潔易懂,感興趣的小伙伴可以自己動手嘗試一下
    2023-07-07
  • C++ Boost Array與Unordered使用介紹

    C++ Boost Array與Unordered使用介紹

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 獲取一個文件行數(shù)的方法

    獲取一個文件行數(shù)的方法

    獲取一個文件行數(shù)的方法,需要的朋友可以參考一下
    2013-03-03
  • 用C++來解決3*3拼圖的問題

    用C++來解決3*3拼圖的問題

    這篇文章主要介紹了用C++來解決3*3拼圖的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

大同县| 甘谷县| 辉南县| 蓬安县| 巴彦淖尔市| 邵阳县| 神池县| 宿松县| 冀州市| 专栏| 延长县| 左贡县| 岚皋县| 黄骅市| 伊吾县| 黎平县| 威海市| 普宁市| 双城市| 旬阳县| 马鞍山市| 华容县| 绥阳县| 醴陵市| 四子王旗| 方山县| 德庆县| 宁德市| 泊头市| 铜鼓县| 遵义县| 滁州市| 登封市| 涡阳县| 洞口县| 临朐县| 陆川县| 镇雄县| 浦东新区| 万载县| 菏泽市|