好久沒看C++的基礎性的知識了,很多東西都忘了。今天在其它地方看到關於C++類protected的地方不太記得。翻了一下《C++ Primer 4th》,發現迷惑的地方更多了,真的是能力渣渣的啊,基礎真的不行。
------------------分割線---------------------
類設計與受保護的成員
如果沒有繼承,類只有兩種使用者:類本身的成員和該類的使用者。將類劃分為private 和 public 存取層級反映了使用者種類的這一分隔:使用者(使用這個類的程式,包括類對象)只能訪問public介面,類成員和友元既可以訪問public成員也可以訪問private成員。
有了繼承,就有了類的第三種使用者:從類派生定義新類的程式員(衍生類別)。衍生類別的提供者通常(但並不總是)需要訪問(一般為private的)基類實現,為了允許這種訪問而仍然禁止對實現的一般訪問,提供了附加的protected訪問標號。類的protected部分仍然不能被一般程式員(使用這個類的使用者)訪問,但可以被衍生類別訪問。只有類本身和友元可以訪問基類的private部分,衍生類別不能訪問基類的private成員。
定義類充當基類時,將成員設計為public的標準並沒有改變:仍然是介面函數應該為public而資料一般不應為public。被繼承的類必須決定實現的哪些部分聲明為protected而哪些部分聲明為private。希望禁止衍生類別訪問的成員應該設為private,提供衍生類別實現所需操作或資料的成員應設為protected。換句話說,提供給衍生類別型的介面是protected成員和public成員的組合。
protected成員
可以認為protected訪問標號中private和public的混合。
1、像private成員一樣,protected成員不能被類的使用者訪問。
2、像public成員一樣,protected成員可被該類的衍生類別訪問。
此外,protected還有另一重要性質。
衍生類別可以通過衍生類別對象訪問基類的protected成員,衍生類別對其基類類型對象的protected成員沒有特殊存取權限。
配上代碼理解大概就是如下(原代碼連結:http://blog.csdn.net/luoruiyi2008/article/details/7179788) :
#include <iostream>using std::cout ;using std::endl ;class Base{public:Base(){};virtual ~Base(){};protected:int int_pro;} ;class A : public Base{public:A(){};A(int da){int_pro = da;} //衍生類別(A)可以直接存取基類(Base)的protected成員(int_pro)void Print(A &obj){obj.int_pro = 24;} //衍生類別對象(obj)可以訪問基類的protected成員(int_pro)void PrintPro(){cout << "The proteted data is " << int_pro <<endl;} //衍生類別(A)可以直接存取基類(Base)的protected成員(int_pro)void PrintBasePro(Base &obj){cout << "The protected data is " << obj.int_pro << endl ;} //衍生類別(A)對基類類型對象(obj)protected成員(int_prot)沒有特殊存取權限,因此加上此句,代碼編譯不通過。} ;int main(void){A aObj;A aObj2(5);aObj2.PrintPro();aObj.Print(aObj2);aObj2.PrintPro();return 0 ;}