程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻剖析C++派生類中的掩護成員繼續

深刻剖析C++派生類中的掩護成員繼續

編輯:關於C++

深刻剖析C++派生類中的掩護成員繼續。本站提示廣大學習愛好者:(深刻剖析C++派生類中的掩護成員繼續)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻剖析C++派生類中的掩護成員繼續正文


protected 與 public 和 private 一樣是用來聲明成員的拜訪權限的。由protected聲明的成員稱為“受掩護的成員”,或簡稱“掩護成員”。從類的用戶角度來看,掩護成員等價於公有成員。但有一點與公有成員分歧,掩護成員可以被派生類的成員函數援用。

假如基類聲清楚明了公有成員,那末任何派生類都是不克不及拜訪它們的,若願望在派生類中能拜訪它們,應該把它們聲明為掩護成員。假如在一個類中聲清楚明了掩護成員,就意味著該類能夠要用作基類,在它的派生類中會拜訪這些成員。

在界說一個派生類時將基類的繼續方法指定為protected的,稱為掩護繼續,用掩護繼續方法樹立的派生類稱為掩護派生類(protected derived class ), 其基類稱為受掩護的基類(protected base class ),簡稱掩護基類。

掩護繼續的特色是:掩護基類的公用成員和掩護成員在派生類中都成了掩護成員,其公有成員仍為基類公有。也就是把基類原本的公用成員也掩護起來,不讓類外隨意率性拜訪。

掩護基類的一切成員在派生類中都被掩護起來,類外不克不及拜訪,其公用成員和掩護成 員可以被其派生類的成員函數拜訪。

掩護基類的一切成員在派生類中都被掩護起來,類外不克不及拜訪,其公用成員和掩護成員可以被其派生類的成員函數拜訪。

比擬一下公有繼續和掩護繼續(也就是比擬在公有派生類中和在掩護派生類中的拜訪屬性), 可以發明,在直接派生類中,以上兩種繼續方法的感化現實上是雷同的:在類外不克不及拜訪任何成員,而在派生類中可以經由過程成員函數拜訪基類中的公用成員和掩護成員。然則假如持續派生,在新的派生類中,兩種繼續方法的感化就分歧了。

例如,假如以公用繼續方法派生出一個新派生類,本來公有基類中的成員在新派生類中都成為弗成拜訪的成員,不管在派生類內或外都不克不及拜訪,而本來掩護基類中的公用成員和掩護成員在新派生類中為掩護成員,可以被新派生類的成員函數拜訪。

年夜家須要記住:基類的公有成員被派生類繼續(不論是公有繼續、私有繼續照樣掩護繼續)後變成弗成拜訪的成員,派生類中的一切成員均沒法拜訪它們。假如須要在派生類中援用基類的某些成員,應該將基類的這些成員聲明為protected,而不要聲明為private。

假如擅長應用掩護成員,可以在類的條理構造中找到數據同享與成員隱藏之間的聯合點。既可完成某些成員的隱藏,又可便利地繼續,能完成代碼重用與擴大。

經由過程以上的引見,可以曉得以下幾點。

1) 在派生類中,成員有4種分歧的拜訪屬性:
公用的,派生類內和派生類外都可以拜訪。
受掩護的,派生類內可以拜訪,派生類外不克不及拜訪,其下一層的派生類可以拜訪。
公有的,派生類內可以拜訪,派生類外不克不及拜訪。
弗成拜訪的,派生類內和派生類外都不克不及拜訪。

須要解釋的是:
這裡所列出的成員的拜訪屬性是指在派生類中所取得的拜訪屬性。
所謂在派生類內部,是指在樹立派生類對象的模塊中,在派生類規模以外。
假如本派生類持續派生,則在分歧的繼續方法下,成員所取得的拜訪屬性是分歧的,在本表中只列出鄙人一層公用派生類中的情形,假如是公有繼續或掩護繼續,年夜家可以從表11.3中找到謎底。

2) 類的成員在分歧感化域中有分歧的拜訪屬性,對這一點要非常清晰。一個成員的拜訪屬性是有條件的,要看它在哪個感化域中。有的讀者問:“一個基類的公用成 員,在派生類中釀成掩護的,畢竟它自己是公用的照樣掩護的?”應該說:這是統一個成員在分歧的感化域中所表示出的分歧特點。例如,黉捨人事部分控制了全校師生員工的資 料,黉捨的引導可以查閱任何人的資料,黉捨部屬的系只能從全校的材料中獲得本系師生員工的材料,而不克不及查閱其他部分任何人的資料。假如你要問:可否查閱張某某的資料, 沒法混為一談,必需查明你的身份,能力決議該人的資料可否被你“拜訪”。

在未引見派生類之前,類的成員只屬於其所屬的類,不觸及其他類,不會惹起歧義。 在引見派生類後,就存在一個成績:在哪一個規模內評論辯論成員的特點,統一個成員在分歧 的繼續條理中有分歧的特點。為了解釋這個概念,可以打個比喻,汽車駕駛證是按地域核發的,北京的駕駛證在北京市規模內通順無阻,假如到了外埠,能夠會遭到某些限制,到了本國就有效了。統一個駕駛員在分歧地域的權力是分歧的。又比方,到病院探視病人,如 果許可你進人病房近間隔地探望病人並與之攀談,則可對病人懂得比擬深人;假如只許可你在玻璃門窗外探視,在必定間隔外看到病人,只能對病人狀態有粗略的印象;假如只許可在病區的走廊裡經由過程電視看病人運動的片斷鏡頭,那就更直接了。人們在分歧的場所下對統一個病人,獲得分歧的信息,或許說,這個病人在分歧的場所下的“可見性”分歧。

平凡,人們常習氣說某類的公用成員若何若何,這在普通不致惹起誤會的情形下是可以的。然則決不要誤以為該成員的拜訪屬性只能是公用的而不克不及轉變。在評論辯論成員的拜訪屬性時,必定要解釋是對甚麼規模而言的,如基類的成員a,在基類中的拜訪屬性是公用的,在公有派生類中的拜訪屬性是公有的。

上面經由過程一個例子解釋如何拜訪掩護成員。

[例] 在派生類中援用掩護成員。

#include <iostream>
#include <string>
using namespace std;
class Student//聲明基類
{
public:
  //基類公用成員
  void display( );
protected:
  //基類掩護成員
  int num;
  string name;
  char sex;
};
//界說基類成員函數
void Student::display( )
{
  cout<<"num: "<<num<<endl;
  cout<<"name: "<<name<<endl;
  cout<<"sex: "<<sex<<endl;
}
class Student1: protected
Student //用protected方法聲明派生類Student1
{
public:
  void display1( );//派生類公用成員函數
private:
  int age;//派生類公有數據成員
  string addr;//派生類公有數據成員
};
void Student1::display1( )//界說派生類公用成員函數
{
  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是派生類中的公用成員函數
  stud1.num=10023; //毛病,外界不克不及拜訪掩護成員
  return 0;
}

在派生類的成員函數中援用基類的掩護成員是正當的。基類的掩護成員對派生類的外界來講是弗成拜訪的(例如,num是基類Student中的掩護成員,因為派生類是掩護繼續,是以它在派生類中依然是受掩護的,外界不克不及用stud1.num來援用它),但在派生類內,它相當於公有成員,可以經由過程派生類的成員函數拜訪。可以看到,掩護成員和公有成員分歧的地方,在於把掩護成員的拜訪規模擴大到派生類中。

留意:在法式中經由過程派生類Student1的對象stud1的公用成員函數display1去拜訪基類的掩護成員num、name和sex,不要誤以為可以經由過程派生類對象名去拜訪基類的掩護 成員(如stud1.num是毛病的)。

公有繼續和掩護繼續方法在應用時須要非常當心,很輕易弄錯,普通不經常使用,本教程前面的例子重要引見公用繼續方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved