標籤:
最近,決定認真開始記錄自己的學習之路。
c++類的存取控制有public、private和protected。
首先要分簡單的基類和衍生類別情況,不是很容易混淆與多級繼承時的存取控制。自己原先搞得不清楚,也正是因為沒有分開二種情況對待。
在簡單的基類和衍生類別情況中,其存取控制,可以簡單總結:
public: 1、成員函數 2、類對象 3、友元 4、子類成員函數
private: 1、成員函數 2、友元
protected: 1、成員函數 2、友元 3、子類成員函數
這些基本都清楚,但是之前比較疑惑的就是繼承也有分public、private和protected。其實這是對衍生類別的子類起作用的,並不影響原先基類和衍生類別的存取控制。
大致情況就是:
假設是public繼承,那麼原先基類的public、private和protected的存取控制對此基類的衍生類別的子類不變。
如果是protected繼承,則原先基類的public降為protected,並且也是對基類的衍生類別的子類起作用。
而private繼承,則把原先基類的public、protected都降為private,並且也是對基類的衍生類別的子類起作用。
可以把基類比喻為水龍頭,而衍生類別的public繼承為原水龍頭大小的管(簡稱大管)、protected繼承為中管、private繼承為小管,當水龍頭水通過水管是,則把原來水龍頭的水縮小了,所以只是對衍生類別子類起作用的。以下通過代碼解釋一下:
class Base
{
public:
int a1;
virtual void test() = 0;
protected:
int a2;
private:
int a3;
};
//------------------------------------------------------------------------------
class Protected_Class_1:protected Base//保護繼承
{
public:
void test()
{
a1 = 1;//a1在這裡被轉變為protected
a2 = 2;//a2在這裡被轉變為protected
//a3=3;//錯誤,衍生類別不能訪問基類的私人成員
}
};
class Protected_Class_2:public Protected_Class_1//以public方式繼承Protected_Class_1類
{
public:
void test()
{
a1 = 1;//a1在這裡仍然保持為a1在這裡被轉變為protected
a2 = 2;//a2在這裡仍然保持為a1在這裡被轉變為protected
//a3=3;//錯誤,由於Base類成員為私人的,即使是上級父類是保護繼承,也不能改變Base類成員的控制類型
}
};
//------------------------------------------------------------------------------
class Private_Class_1:private Base//私人繼承
{
public:
void test()
{
a1 = 1;//a1在這裡被轉變為private
a2 = 2;//a2在這裡被轉變為private
//a3=3;//錯誤,基類私人成員一樣是不可訪問的
}
};
class Private_Class_2:public Private_Class_1//以public方式繼承Private_Class_1類
{
public:
void test()
{
//a1=1;//錯誤,由於基類Private_Class_1為私人繼承,a1已經轉變為private
//a2=2;//錯誤,由於基類Private_Class_1為私人繼承,a1已經轉變為private
//a3=3;//錯誤,由於Base類成員為私人的,Private_Class_1類也為私人繼承
}
};
//------------------------------------------------------------------------------
class Public_Class_1:public Base//共有繼承有區別與其它方式的繼承,繼承後的各成員不會其改變控制方式
{
public:
void test()
{
a1 = 1;//a1仍然保持public
a2 = 2;//a2仍然保持protected
//a3=3;//錯誤,衍生類別不能操作基類的私人成員
}
};
class Public_Class_2:public Public_Class_1//以public方式繼承Public_Class_1類
{
public:
void test()
{
a1 = 1;//a1仍然保持public
a2 = 2;//a2仍然保持protected
//a3=3;//錯誤,由於Base類成員為私人成員,即使是上級父類是公有繼承,也不能改變Base類成員的控制類型
}
};
c++存取控制與繼承