當一個子類從父類繼承時,父類的所有成員成爲子類的成員,此時對父類成員的訪問狀態由繼承時使用的繼承限定符決定。
c++訪問權限和派生繼承 在基類中,public表示成員是公有的:可以由程序中任何函數訪問。所以公有成員一般是成員函數,它提供了外部程序與類的接口功能,用戶通過公有成員訪問該類對象中的數據。 第一:private, public, protected 訪問標號的訪問範圍。
private:只能由1.該類中的函數、2.其友元函數訪問。
不能被任何其他訪問,該類的對象也不能訪問。
protected:可以被1.該類中的函數、2.其友元函數訪問 3.子類的函數。 但不能被該類的對象訪問。
public:可以被1.該類中的函數、2.其友元函數訪問 3.子類的函數、也可以由4.該類的對象訪問。 class A { private: int a; public: int b; protected: int c; }; A ca; ca.a //error ca.b // ok ca.c //error class B :public A { public: int d; } B cb; cb.b; //ok cb.c //error。雖然c也是B的成員,但c在被繼承的時候變成私有或者受保護的成員了。 注:友元函數包括3種:設爲友元的普通的非成員函數;設爲友元的其他類的成員函數;設爲友元類中的所有成員函數。 派生類的生成過程:
class employee { }; class { }; 分析派生新類這個過程,其繼承和派生機制的主要目的是實現代碼的重用和擴充。實際是經歷了三個步驟:吸收基類成員、改造基類成員、添加新的成員。 1.吸收基類成員 第一步是將基類的成員全盤接收:包含了它的所有基類中除構造和析構函數之外的所有成員。 這裏派生類technician繼承了基類employee的除構造和析構函數以外的所有成員: name; pay(); 經過派生過程,這些成員便存在於派生類之中。 2.改造基類函數 對基類成員的改造包括兩個方面, 一個是基類成員的訪問控制問題,主要依靠派生類聲明時的繼承方式來控制: 類的繼承方式:public、protected和private三種訪問屬性。 第二個是對基類數據或函數成員的覆蓋, 如果派生類聲明瞭一個和某個基類成員同名的新成員(如果是成員函數,則參數表也要相同, 如pay(); 3.添加新的成員 我們可以根據實際情況的需要,給派生類添加適當的數據和函數成員,來實現必要的新增功能。如technician派生類中的hourlyRate和workHours,在派生過程中,由於基類的構造函數和析構函數是不能被繼承下來的,因此我們就需要在派生類重新加入新的構造函數和析構函數來實現一些特別的初始化和清理工作,例如派生類technician的構造函數technician(); 第二:類的繼承後方法屬性變化。 特別的private,它們與派生類中新增加的private成員不同,派生類函數或是建立派生類對象的模塊都無法訪問到它們。)(所以只能通過在派生類中調用基類的函數去訪問private屬性,也可以把基類的函數用public繼承下來來訪問)
private繼承,父類的所有方法在子類中變爲private; protected繼承,父類的protected和public方法在子類中變爲protected,private方法不變; public繼承,父類中的方法屬性不發生改變; 原來是怎樣就怎樣 public和protected在任何方式繼承的情況下,也能被子類函數調用。
如下所示:
public繼承 protected繼承 protected
特別的private:不能被派生類函數和派生類對象直接調用,(用派生類對象訪問時)只能重新定義:調用基類
private繼承
private:不能被派生類對象直接調用,1.可間接被派生類函數重新定義來調用。2.基類函數調用(用派生類對象訪問時)只能重新定義:調用基類
上面爲一次繼承的情況,若有些是沒區別的,當時如果再繼承的話就有區別了
繼承下來的訪問屬性分爲四種:
1.區分繼承與訪問,特別的private爲不能繼承下來的,但可以訪問
2.(private)成員:包括從基類繼承下來的非私有成員(私有繼承時),以及派生類中新增加的私有成員,在派生類內部函數都可以訪問到,但派生類對象不能訪問。
3.(protected)可能是新增也可能是從基類繼承過來的,派生類內部成員函數可以訪問,當派生類對象無法訪問。
4.(public)成員:派生類成員函數和對象都能訪問到
protected繼承和private繼承能降低訪問權限。 基類的public和protected成員的訪問屬性在派生類中不變,而基類的private成員仍保持私有屬性。
可得:派生類的其他成員函數和對象可以直接訪問基類的公有成員和保護成員。
公有public繼承
class vehicle
{
};
class car:public vehicle
{
//這裏不是調用基類構造函數,而是初始化賦值列表。
{
int get_passengers(){return passenger_load;}
};
void main()
{
car bluebird(4,1000);
cout<<"The message of bluebird(wheels,weight,passengers):"<<endl;
cout<<bluebird.get_wheels()<<","
}
car public繼承verhicle後,
private:wheels;
protected:weight;
public:
保護protected繼承
基類的public和protected成員都變爲保護成員,而基類的private成員不可訪問。
即基類中的保護成員只能被基類的成員函數或派生類的成員函數訪問。
舉例:
car protected繼承verhicle後,
private:wheels;
protected:weight;
public
所以要在派生類中使用對象訪問,必須做一下修改:
class car:protected vehicle
{
//這裏不是調用基類構造函數,而是初始化賦值列表。
{
int get_passengers(){return passenger_load;}
};
這裏爲了保證基類的部分外部接口特徵能夠在派生類中也存在,就必須在派生類中重新定義同名的成員函數 get_wheels()和get_weight(),根據同名覆蓋的原則,在主函數中自然調用的是派生類的函數。
如果使用私有繼承: 在該例子和protected一樣。 |