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

C++繼續中的拜訪掌握實例剖析

編輯:關於C++

C++繼續中的拜訪掌握實例剖析。本站提示廣大學習愛好者:(C++繼續中的拜訪掌握實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++繼續中的拜訪掌握實例剖析正文


本文較為深刻的商量了C++繼續中的拜訪掌握,對深刻控制C++面向對象法式設計長短常需要的。詳細內容以下:

平日來講,我們以為一個類有兩種分歧的用戶:通俗用戶 和 類的完成者。個中,通俗用戶編寫的代碼應用類的對象,這部門代碼只能拜訪類的私有(接口)成員;完成者則擔任編寫類的成員和友元的代碼,成員和友元既能拜訪類的私有部門,也能拜訪類的公有部門。假如進一步斟酌繼續的話就會湧現第三種用戶,即派生類。派生類可以拜訪基類的私有(public)成員和受掩護(protected)成員,但不克不及拜訪基類的公有(private)成員。

繼續相干點以下:

①.年夜多半類都只繼續自一個類,這類情勢的繼續叫做“單繼續”。本文重要講的是單繼續。
②.一個派生類的對象中,包括繼續自基類的部門和派生類自界說的部門。正由於派生類含有基類部門,所以可以停止派生類到基類的類型轉換,這類轉換是隱式的。
③.不存在從基類向派生類的隱式類型轉換。
④.派生類向基類的主動類型轉換只對指針或援用有用,對象之間不存在類型轉換。
⑤.假如基類界說了靜態成員,則豈論派生出若干個派生類,每一個靜態成員都只存在獨一實例。
⑥避免一個類被繼續可使用症結字final,這時候C++11新尺度中供給的。

另外,讀者還須要懂得一下後面文章所引見的繼續中的虛函數與純虛函數。

1、私有、公有和受掩護成員

1 . 拜訪解釋符

在C++中經由過程應用拜訪解釋符public、protected、private來對類的成員停止拜訪掌握,掌握成員關於通俗用戶或派生類來講能否可拜訪:

public:界說為public的成員對通俗用戶、類的完成者、派生類都是可拜訪的。public平日用於界說類的內部接口。

protected:界說protected成員的目標是讓派生類可以拜訪而制止其他用戶拜訪。所以類的完成者和派生類可以拜訪,而通俗用戶不克不及拜訪。

private:界說為private的成員只能被類的完成者(成員和友元)拜訪。private部門平日用於封裝(即隱蔽)類的完成細節。

class People{ 
protected: 
  string name; 
}; 
 
class Student : public People{ 
public: 
  friend void Print(Student &s); 
  friend void Print(People &p); 
}; 
 
// 准確,可以經由過程派生類對象拜訪基類的protected成員 
void Print(Student &s){ s.name="Songlee"; cout<< s.name << endl; } 
// 毛病,不克不及經由過程基類對象拜訪基類的protected成員 
void Print(People &p){ p.name="Songlee"; cout<< p.name << endl; } 

須要留意的是,派生類的成員或友元只能經由過程派生類對象來拜訪基類的受掩護成員。派生類關於一個基類對象中的受掩護成員沒有任何拜訪特權。

2 . 轉變成員的可拜訪性

有時我們須要轉變派生類繼續的某個名字的拜訪級別,經由過程應用using聲明:

class People{ 
protected: 
  string name; 
}; 
 
class Student : public People{ 
public: 
  using People::name; // 將繼續來的name成員的拜訪權限改成public 
}; 
 
int main() 
{ 
  Student me; 
  me.name = "SongLee";   // 可以拜訪name了 
  cout << me.name << endl;  
  return 0; 
} 

經由過程在類的外部應用using聲明語句,我們可以將該類的直接或直接基類中的任何可拜訪成員(非公有成員)標志出來,轉變其拜訪權限。

2、私有、公有和受掩護繼續

我們留意到,在類的派生列表頂用到了拜訪解釋符public、protected和private,它們分離表現分歧的繼續方法:

class A : public B { /* */ };   // 私有繼續 
class A : private B { /* */ };  // 公有繼續 
class A : protected B { /* */ }; // 受掩護繼續 

派生類的派生列表中的拜訪解釋符關於派生類的成員(及友元)可否拜訪其直接基類的成員沒甚麼影響。派生類的成員(及友元)對基類成員的拜訪權限只與基類中的拜訪解釋符有關。

那末派生列表中的拜訪解釋符有甚麼感化呢?

派生列表中拜訪解釋符的感化是掌握派生類用戶關於基類成員的拜訪權限,留意是派生類的用戶。上面給出分歧的繼續方法招致的拜訪權限的變更:

public繼續:假如繼續是私有的,則成員將遵守其原本的拜訪解釋符。父類中的public、protected和private屬性在子類中不產生轉變。

protected繼續:比protected級別高的拜訪權限會釀成protected。即父類中的public屬性在子類中變成protected,父類中的protected和private屬性在子類中不變。

private繼續:比private級別高的拜訪權限會釀成private。即父類中的三種拜訪屬性在子類中都邑釀成private。

class A {  // 基類 
public: 
  string A_public;   // 私有成員 
protected: 
  string A_protected;  // 受掩護成員 
}; 
 
class B : private A {  // 公有繼續 
public: 
  B(){ A_public="public"; A_protected="protected"; }; 
}; 
 
int main() 
{ 
  B b;  // 經由過程B的對象拜訪 
  cout << b.A_public <<" "<< b.A_protected << endl;  // 毛病,由於是公有繼續 
  return 0; 
}

假如我們在派生列表中不應用拜訪解釋符,則struct症結字默許的是私有繼續,class症結字默許的是公有繼續。不外建議在繼續時最好顯式地將拜訪解釋符寫出來。

別的,分歧的繼續方法也會影響派生類向基類的轉換,假定Derive繼續自Base:

1.只要當Derive私有地繼續自Base時,用戶代碼能力應用派生類向基類的轉換;假如Derive繼續Base的方法是受掩護的或許公有的,則用戶代碼不克不及應用該轉換。

2.豈論Derive以甚麼方法繼續Base,Derive的成員函數和友元都能應用派生類向基類的轉換;派生類向其直接基類的類型轉換關於派生類的成員和友元來講永久是可拜訪的。

3.假如Derive繼續Base的方法是私有的或許受掩護的,則Derive的派生類的成員和友元可使用Derive向Base的類型轉換;反之,假如Derive繼續Base的方法是公有的,則不克不及應用。

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