protected、public、private
阿新 • • 發佈:2017-11-03
無法 說明符 nbsp 例子 span 包括 派生 pre 用戶
一、protected成員
1. 受保護的成員的可訪問性
- 對於一個類的protected成員,①該類的用戶(如類對象)不能訪問它,②該類的派生類的成員(及其友元)可以訪問它。
- 派生類的成員及其友元不能訪問其基類對象的受保護成員,它們只能訪問繼承到派生類對象中的受保護成員
- 派生類的成員及其友元只能訪問派生類對象中的基類部分的protected成員,不能訪問普通的基類對象中的protected成員
借助下面的例子加深理解:
class Base { protected: int proc = 0; }; class Derv : public Base { void set_base_false() { Base b; b.proc = 1; //[Error] ‘int Base::proc‘ is protected } void set_base_true() { Derv d; d.proc = 1; } void set_base_true2() { proc = 1; //訪問該派生類繼承而來的proc成員 } };
二、三種繼承方式
1. 派生訪問說明符
對於派生類的成員及友元能否訪問其直接基類的成員沒什麽影響
目的:控制派生類用戶(包括派生類的派生類在內)對於基類成員的訪問權限
2. 繼承方式不影響派生類的成員及其友元訪問基類的成員
class Base { public: void pub_mem(); protected: int prot_mem; private: int priv_mem; }; //公有繼承 class Pub_derv : public Base { int f1() { pub_mem(); } int f2() { return prot_mem; } int f3() { return priv_mem; } //錯誤:派生類不可訪問private成員 }; //私有繼承 class Priv_derv : private Base { int f1() { pub_mem(); } int f2() { return prot_mem; } int f3() { return priv_mem; } //錯誤:派生類不可訪問private成員 };
3. 繼承方式影響派生類對象及其派生類訪問基類的成員
公有繼承:派生類中(從基類中)繼承而來的成員都遵循其原有的訪問說明符
私有繼承:派生類中(從基類中)繼承而來的成員的訪問說明符都是private
保護繼承:派生類中(從基類中)繼承而來的成員,若其在基類中的訪問說明符是public,則在派生類中的訪問說明符變為protected
Pub_derv d1; //公有繼承而來的派生類對象d1 Priv_derv d2; //私有繼承而來的派生類對象d2 d1.pub_mem(); //正確:pub_mem()在派生類中是public的 cout << d1.prot_mem << endl; //錯誤:prot_mem在派生類中是protected的,但類的對象無法訪問protected成員 d2.pub_mem(); //錯誤:pub_mem()在派生類中是private的
補充:其實題目中所說的基類的成員是指繼承到派生類中的基類的成員(即,派生類的成員的基類部分)
三、派生類向基類轉換的可訪問性
0. 影響因素
使用該轉換的代碼
派生類的派生訪問說明符
1. D繼承自B
- D公有地繼承B時,用戶代碼才能使用派生類向基類的轉換(用戶代碼可訪問B的公有成員)
- 如果B是D的直接基類,則D的成員和友元可以使用派生類向基類的轉換(D的成員和友元可訪問B的公有成員)
- D不是私有地繼承B時,則D的派生類的成員和友元可以使用D向B的類型轉換(D的派生類的成員和友元可訪問B的公有成員)
小結:對於代碼中的某個給定節點來說,如果基類的公有成員是可訪問的,則派生類向基類的類型轉換也是可訪問的。
protected、public、private