日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 15 OOP)访问控制与继承

發(fā)布時間:2025/3/21 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 15 OOP)访问控制与继承 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 用戶和類的實現(xiàn)者

用戶:指類的對象或?qū)嵗?br /> 類的實現(xiàn)者:包括類的成員。

2. private、public、protect成員

2.1派生類可以訪問公有public成員,而不能訪問私有private成員

2.2 protect成員

希望派生類分享但是不想被其他公共訪問使用的成員。

  • 可以看做是public和private中的產(chǎn)物。
  • 受保護的成員對類的用戶來說是不可訪問的。
  • 受保護的成員對于派生類的成員和友元來說是可訪問的。
class Base{ protected:int prot_mem; //protected 成員}; class Sneaky:public Base{friend void clobber(Sneaky&); //能訪問Sneaky::prot_memfriend void clobber(Base&); //不能訪問Base::prot_memint j; } //正確能訪問Sneaky對象的private和protected成員 void clobber(Sneaky& s) {s.j=s.prot_mem=0;} void clobber(Base& b){b.prot_mem=0;}//錯誤不能訪問protected的成員

3. 派生訪問說明符

  • 對于派生類的成員(及友元)能否訪問其直接積累的成員沒什么影響。eg. private 不影響派生類的訪問權(quán)限,主要影響,相關(guān)函數(shù)的使用。
  • 主要用來控制派生類用戶對于基類成員的訪問權(quán)限。比如struct Priv_Drev: private Base{}意味著在派生類Priv_Drev中,從Base繼承而來的部分都是private的。
class Base2 {friend class Pal; public:void pub_mem() {} protected:int prot_mem; private:char priv_mem; };struct Pub_Derv : public Base2 {int f() {return prot_mem;} };struct Priv_Derv : private Base2 {//私有繼承不影響派生類中的訪問,只是Base對于Priv_Derv來說都是private的int f() const {return prot_mem;} };void fun1() {Pub_Derv d1;Priv_Derv d2;d1.pub_mem(); // d2.pub_mem(); //error:這里是私有繼承,用戶不能調(diào)用private類型的 }

3.1 說明符可以控制繼承自派生類的新類的訪問權(quán)限

struct Derived_from_public : public Pub_Derv {int use_base() { return prot_mem; } //ok:protected in pub_Derv };struct Derived_from_private : public Priv_Derv {int use_base(){return prot_mem;} // error:這里prot_mem是private類型 };

3.2 派生類向基類轉(zhuǎn)換的可訪問性

假設(shè)D繼承自B,

  • 只有當D公有地繼承B時,用戶代碼才能夠使用派生類向基類的轉(zhuǎn)換;如果D繼承B的方式是保護的或者私有的,則用戶代碼不能使用該轉(zhuǎn)換。
  • 不論D以什么方式繼承B,D的成員函數(shù)和友元都能使用派生類向基類的的轉(zhuǎn)換;派生類向其會直接基類的類型轉(zhuǎn)換對于派生類的成員和友元來說是永遠可以訪問的。
  • 如果D繼承B的方式是公有的或者受保護的,則D的派生類的成員和友元可以使用D向B的類型轉(zhuǎn)換;反之,如果D繼承B的方式是私有的,則不能使用
  • 對于代碼中的某個給定節(jié)點來說,如果基類的公有成員是可以訪問的,則派生類向基類的類型轉(zhuǎn)換也是可訪問的;反之則不行。

4. 友元與繼承

4.1 友元關(guān)系不能傳遞

如果windows_mgr有它自己的友元,那么這些友元并不一定具有訪問Screen的特權(quán)。

class Screen{friend class windows_mgr; };

4.2. 友元關(guān)系不能繼承(每個類負責控制各自成員的訪問權(quán)限)

class Base{friend class Pal; protected:int prot_mem; //protected 成員 }; class Sneaky:public Base{friend void clobber(Sneaky&); //能訪問Sneaky::prot_memfriend void clobber(Base&); //不能訪問Base::prot_memint j; } class Pal { public:int f(Base2 b) {return b.prot_mem;} // int f2(Sneaky s) {return s.j;} error:Pal 不是Sneaky的友元int f3(Sneaky2 s2) {return s2.prot_mem;} //不要驚訝,這是對的 }; class D2 : public Pal { public: // int mem(Base2 b){return b.prot_mem;} error: 友元是無法繼承的!!! };

5. using改變個別成員的可訪問性

通過using聲明可以改變派生類繼承的某個名字的訪問級別。

  • private using 該名字能被類的成員和友元訪問;
  • public using 類的所有成員都能訪問。
  • protectde using 類的成員、友元和派生類是可訪問的。
class Base { public:std::size_t size() const { return n; } protected:std::size_t n; };class Derived : private Base { public:using Base::size; //保持對象尺寸相關(guān)的成員的訪問級別 protected:using Base::n; //使用using關(guān)鍵字改變成員變量的訪問級別。 }; Derived d; std::size_t t1 = d.size();//ok std::size_t t2 = d.n;//error

6. 默認的繼承保護級別

使用class關(guān)鍵字定義的派生類是私有繼承的;使用struct關(guān)鍵字定義的派生類是公有繼承的。


【引用】

[1] 代碼oopTest.h

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 15 OOP)访问控制与继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。