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

C++繼承中的訪問控制實(shí)例分析

 更新時間:2014年08月14日 17:29:52   投稿:shichen2014  
這篇文章主要介紹了C++繼承中的訪問控制,是面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的知識點(diǎn),需要的朋友可以參考下

本文較為深入的探討了C++繼承中的訪問控制,對深入掌握C++面向?qū)ο蟪绦蛟O(shè)計(jì)是非常必要的。具體內(nèi)容如下:

通常來說,我們認(rèn)為一個類有兩種不同的用戶:普通用戶 和 類的實(shí)現(xiàn)者。其中,普通用戶編寫的代碼使用類的對象,這部分代碼只能訪問類的公有(接口)成員;實(shí)現(xiàn)者則負(fù)責(zé)編寫類的成員和友元的代碼,成員和友元既能訪問類的公有部分,也能訪問類的私有部分。如果進(jìn)一步考慮繼承的話就會出現(xiàn)第三種用戶,即派生類。派生類可以訪問基類的公有(public)成員和受保護(hù)(protected)成員,但不能訪問基類的私有(private)成員。

繼承相關(guān)點(diǎn)如下:

①.大多數(shù)類都只繼承自一個類,這種形式的繼承叫做“單繼承”。本文主要講的是單繼承。
②.一個派生類的對象中,包含繼承自基類的部分和派生類自定義的部分。正因?yàn)榕缮惡谢惒糠郑钥梢赃M(jìn)行派生類到基類的類型轉(zhuǎn)換,這種轉(zhuǎn)換是隱式的。
③.不存在從基類向派生類的隱式類型轉(zhuǎn)換。
④.派生類向基類的自動類型轉(zhuǎn)換只對指針或引用有效,對象之間不存在類型轉(zhuǎn)換。
⑤.如果基類定義了靜態(tài)成員,則不論派生出多少個派生類,每個靜態(tài)成員都只存在唯一實(shí)例。
⑥防止一個類被繼承可以使用關(guān)鍵字final,這時C++11新標(biāo)準(zhǔn)中提供的。

此外,讀者還需要了解一下前面文章所介紹的繼承中的虛函數(shù)與純虛函數(shù)。

一、公有、私有和受保護(hù)成員

1 . 訪問說明符

在C++中通過使用訪問說明符public、protected、private來對類的成員進(jìn)行訪問控制,控制成員對于普通用戶或派生類來說是否可訪問:

public:定義為public的成員對普通用戶、類的實(shí)現(xiàn)者、派生類都是可訪問的。public通常用于定義類的外部接口。

protected:定義protected成員的目的是讓派生類可以訪問而禁止其他用戶訪問。所以類的實(shí)現(xiàn)者和派生類可以訪問,而普通用戶不能訪問。

private:定義為private的成員只能被類的實(shí)現(xiàn)者(成員和友元)訪問。private部分通常用于封裝(即隱藏)類的實(shí)現(xiàn)細(xì)節(jié)。

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; } 

需要注意的是,派生類的成員或友元只能通過派生類對象來訪問基類的受保護(hù)成員。派生類對于一個基類對象中的受保護(hù)成員沒有任何訪問特權(quán)。

2 . 改變成員的可訪問性

有時我們需要改變派生類繼承的某個名字的訪問級別,通過使用using聲明:

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

通過在類的內(nèi)部使用using聲明語句,我們可以將該類的直接或間接基類中的任何可訪問成員(非私有成員)標(biāo)記出來,改變其訪問權(quán)限。

二、公有、私有和受保護(hù)繼承

我們注意到,在類的派生列表中用到了訪問說明符public、protected和private,它們分別表示不同的繼承方式:

class A : public B { /* */ };   // 公有繼承 
class A : private B { /* */ };  // 私有繼承 
class A : protected B { /* */ }; // 受保護(hù)繼承 

派生類的派生列表中的訪問說明符對于派生類的成員(及友元)能否訪問其直接基類的成員沒什么影響。派生類的成員(及友元)對基類成員的訪問權(quán)限只與基類中的訪問說明符有關(guān)。

那么派生列表中的訪問說明符有什么作用呢?

派生列表中訪問說明符的作用是控制派生類用戶對于基類成員的訪問權(quán)限,注意是派生類的用戶。下面給出不同的繼承方式導(dǎo)致的訪問權(quán)限的變化:

public繼承:如果繼承是公有的,則成員將遵循其原有的訪問說明符。父類中的public、protected和private屬性在子類中不發(fā)生改變。

protected繼承:比protected級別高的訪問權(quán)限會變成protected。即父類中的public屬性在子類中變?yōu)閜rotected,父類中的protected和private屬性在子類中不變。

private繼承:比private級別高的訪問權(quán)限會變成private。即父類中的三種訪問屬性在子類中都會變成private。

class A {  // 基類 
public: 
  string A_public;   // 公有成員 
protected: 
  string A_protected;  // 受保護(hù)成員 
}; 
 
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;  // 錯誤,因?yàn)槭撬接欣^承 
  return 0; 
}

如果我們在派生列表中不使用訪問說明符,則struct關(guān)鍵字默認(rèn)的是公有繼承,class關(guān)鍵字默認(rèn)的是私有繼承。不過建議在繼承時最好顯式地將訪問說明符寫出來。

另外,不同的繼承方式也會影響派生類向基類的轉(zhuǎn)換,假定Derive繼承自Base:

1.只有當(dāng)Derive公有地繼承自Base時,用戶代碼才能使用派生類向基類的轉(zhuǎn)換;如果Derive繼承Base的方式是受保護(hù)的或者私有的,則用戶代碼不能使用該轉(zhuǎn)換。

2.不論Derive以什么方式繼承Base,Derive的成員函數(shù)和友元都能使用派生類向基類的轉(zhuǎn)換;派生類向其直接基類的類型轉(zhuǎn)換對于派生類的成員和友元來說永遠(yuǎn)是可訪問的。

3.如果Derive繼承Base的方式是公有的或者受保護(hù)的,則Derive的派生類的成員和友元可以使用Derive向Base的類型轉(zhuǎn)換;反之,如果Derive繼承Base的方式是私有的,則不能使用。

相關(guān)文章

  • QT中窗口關(guān)閉自動銷毀的實(shí)現(xiàn)示例

    QT中窗口關(guān)閉自動銷毀的實(shí)現(xiàn)示例

    這篇文章主要介紹了QT中窗口關(guān)閉自動銷毀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Qt中QTextEdit和QPlainTextEdit控件的實(shí)現(xiàn)

    Qt中QTextEdit和QPlainTextEdit控件的實(shí)現(xiàn)

    本文主要介紹了Qt中QTextEdit和QPlainTextEdit控件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 基于C++編寫一個密碼系統(tǒng)

    基于C++編寫一個密碼系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個簡單的密碼系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C++中菱形繼承的解釋與處理詳解

    C++中菱形繼承的解釋與處理詳解

    菱形繼承是多重繼承中跑不掉的,Java拿掉了多重繼承,輔之以接口。C++中雖然沒有明確說明接口這種東西,但是只有純虛函數(shù)的類可以看作Java中的接口,下面這篇文章主要給大家介紹了關(guān)于C++中菱形繼承的解釋與處理的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • VC中BASE64編碼和解碼使用詳解

    VC中BASE64編碼和解碼使用詳解

    Base64是一種很常用的編碼方式,利用它可以將任何二進(jìn)制的字符編碼到可打印的64個字符之中, 這樣,不管是圖片,中文文本等都可以編碼成只有ASCII的純文本。
    2015-11-11
  • Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 是一款非常好用,簡約的C/C++開發(fā)工具,本文主要介紹了Dev C++ 安裝及使用方法(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C語言實(shí)現(xiàn)發(fā)送郵件功能

    C語言實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于Matlab實(shí)現(xiàn)離散系統(tǒng)分岔圖的繪制

    基于Matlab實(shí)現(xiàn)離散系統(tǒng)分岔圖的繪制

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-04-04
  • C++ getcwd函數(shù)獲取項(xiàng)目運(yùn)行路徑方法詳解

    C++ getcwd函數(shù)獲取項(xiàng)目運(yùn)行路徑方法詳解

    在Linux下做QT項(xiàng)目時,需要獲取項(xiàng)目的運(yùn)行路徑,于是用getcwd函數(shù)進(jìn)行獲取,然后在Windows下進(jìn)行測試,發(fā)現(xiàn)獲取到的是程序的項(xiàng)目路徑,即代碼文件路徑,然后再Linux QT中測試,獲取到的又是運(yùn)行路徑,這就很納悶了。經(jīng)過再三測試,終于發(fā)現(xiàn)了原因
    2022-10-10
  • C++基于單鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    C++基于單鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++基于單鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

腾冲县| 两当县| 华蓥市| 大方县| 新和县| 河东区| 福贡县| 进贤县| 沾益县| 安达市| 松滋市| 罗山县| 云霄县| 万宁市| 盖州市| 龙陵县| 上饶市| 合江县| 凤冈县| 齐齐哈尔市| 长寿区| 抚顺县| 兴安县| 云和县| 霞浦县| 淳安县| 竹山县| 本溪市| 红河县| 航空| 娄烦县| 榆林市| 云南省| 潼南县| 缙云县| 正宁县| 洛阳市| 柳河县| 泗阳县| 太仆寺旗| 邛崃市|