關於繼承、派生、public、protected、private

幾個要點:

①每個類控制它所定義的成員的訪問,派生類可以進一步限制但不能放鬆對所繼承的成員的訪問。

②無論派生列表中是什麼訪問標號,所有繼承Base的類對於Base中的成員具有相同的訪問,派生訪問標號將控制派生類的用戶對從Base繼承而來的成員的訪問或控制來自非直接派生類的訪問。

③public派生類繼承基類的接口,它具有與基類相同的接口,而是用private或protected派生的類不繼承基類的接口,迄今爲止,最常見的繼承形式是public。

====================================================================================

當private,public,protected單純的作爲一個類中的成員權限設置時:

private: 只能由該類中的函數、其友元函數訪問,不能被任何其他訪問,該類的對象也不能訪問. 

protected: 可以被該類中的函數、子類的函數、以及其友元函數訪問,但不能被該類的對象訪問 

public: 可以被該類中的函數、子類的函數、其友元函數訪問,也可以由該類的對象訪問
注:友元函數包括兩種:設爲友元的全局函數,設爲友元類中的成員函數

當private,public,protected作爲繼承方式時:

對於公有繼承方式: 
(1)父類的public成員成爲子類的public成員,允許類以外的代碼訪問這些成員
(2)父類的private成員仍舊是父類的private成員,子類成員不可以訪問這些成員;
(3)父類的protected成員成爲子類的protected成員,只允許子類成員訪問;

(1) 基類成員對其對象的可見性: 

公有成員可見,其他不可見。這裏保護成員同於私有成員。 

(2) 基類成員對派生類的可見性: 

公有成員和保護成員可見,而私有成員不可見。這裏保護成員同於公有成員。 

(3) 基類成員對派生類對象的可見性: 

公有成員可見,其他成員不可見。 

所以,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這裏,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。 

對於私有繼承方式: 

(1)父類的public成員成爲子類的private成員,只允許子類成員訪問
(2)父類的private成員仍舊是父類的private成員,子類成員不可以訪問這些成員;
(3)父類的protected成員成爲子類的private成員,只允許子類成員訪問;


(1) 基類成員對其對象的可見性: 

公有成員可見,其他成員不可見。 

(2) 基類成員對派生類的可見性: 

公有成員和保護成員是可見的,而私有成員是不可見的。 

(3) 基類成員對派生類對象的可見性: 

所有成員都是不可見的。 

所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。 

對於保護繼承方式: 

(1)父類的public成員成爲子類的protected成員,只允許子類成員訪問
(2)父類的private成員仍舊是父類的private成員,子類成員不可以訪問這些成員;
(3)父類的public成員成爲子類的protected成員,只允許子類成員訪問;


這種繼承方式與私有繼承方式的情況相同。兩者的區別僅在於對派生類的成員而言,對基類成員有不同的可見性。 

上述所說的可見性也就是可訪問性。關於可訪問性還有另的一種說法。這種規則中,稱派生類的對象對基類訪問爲水平訪問,稱派生類的派生類對基類的訪問爲垂直訪問。 

一般規則如下: 

公有繼承時,水平訪問和垂直訪問對基類中的公有成員不受限制; 
私有繼承時,水平訪問和垂直訪問對基類中的公有成員也不能訪問; 
保護繼承時,對於垂直訪問同於公有繼承,對於水平訪問同於私有繼承。 

==================================================================================

已知3個類O、P和Q,類O中定義了一個私有方法F1、一個公有方法F2和一個受保護的方法F3:類P和類Q是類O的派生類,其繼承方式如下所示: 
class P : protected O {…}; 
class Q : public O {…}; 
關於方法F1的描述中正確的是___(34)___;關於方法F2的描述中正確的是___(35)___;關於方法F3的描述中正確的是___(36)___。 
(34)
A.方法F1無法被訪問 
B.只有在類O內才能訪問方法F1 
C.只有在類P內才能訪問方法F1 
D.只有在類Q內才能訪問方法F1 
(35)
A.類O、P和Q的對象都可以訪問方法F2 
B.類P和Q的對象都可以訪問方法F2 
C.類0和Q的對象都可以訪問方法F2 
D.只有在類P內才能訪問方法F2 
(36)
A.類0、P和Q的對象都可以訪問方法F3 
B.類0、P和Q的對象都不可以訪問方法F3 
C.類0和Q的對象都可以訪問方法F3 
D.類P和Q的對象都可以訪問方法F3。
==================================================
該題目涉及到兩個知識點: 
第一:private,public,protected方法的訪問範圍. 
private: 只能由該類中的成員函數和友員訪問,不能被該類的對象訪問;
protected: 可以被該類中的成員函數和其友元函數訪問,以及由該類的派生類的成員函數和友元使用,但不能被該類的對象訪問;
public: 可以被該類中的成員函數和其友元函數訪問,以及由該類的派生類的成員函數和友元使用,,也可以由該類的對象訪問.
第二:類的繼承後方法屬性變化: 
使用private繼承,父類的所有方法在子類中變爲private; 
使用protected繼承,父類的protected和public方法在子類中變爲protected,private方法不變; 
使用public繼承,父類中的方法屬性不發生改變; 
由上面兩個分析,不難得出上述問題的正確答案: 
(34) B 私有方法只能在本類中訪問,子類繼承父類的共有,保護方法,但不能訪問父類的私有方法; 
(35) C 公有方法可以被類的對象訪問,但使用protected繼承後,子類中的方法都爲保護方法,不能被該子類的對象訪問,使用public繼承子類對象可以訪問子類中的公有方法; 
(36) B protected方法不能被自類的對象訪問;子類採用protected和public方法繼承,父類中protected方法仍然爲protected方法,無法使用子類的對象訪問,同時父類本身的對象也無法訪問;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章