C 繼承許可權和繼承方式

2021-08-21 03:03:23 字數 4111 閱讀 4147

c++繼承的一般語法為:

class 派生類名:[繼承方式] 基類名;

繼承方式限定了基類成員在派生類中的訪問許可權,包括 public(公有的)、private(私有的)和 protected(受保護的)。此項是可選項,如果不寫,預設為 private(成員變數和成員函式預設也是 private)。

現在我們知道,public、protected、private 三個關鍵字除了可以修飾類的成員,還可以指定繼承方式。類成員的訪問許可權由高到低依次為 public --> protected --> private,我們在《

c++類成員的訪問許可權

》一節中講解了 public 和 private:public 成員可以通過物件來訪問,private 成員不能通過物件訪問。

現在再來補充一下 protected。

protected 成員和 private 成員類似,也不能通過物件訪問。

但是當存在繼承關係時,protected 和 private 就不一樣了:基類中的 protected 成員可以在派生類中使用,而基類中的 private 成員不能在派生類中使用,下面是詳細講解。不同的繼承方式會影響基類成員在派生類中的訪問許可權。

1) public繼承方式

2) protected繼承方式

3) private繼承方式

通過上面的分析可以發現:

1) 基類成員在派生類中的訪問許可權不得高於繼承方式中指定的許可權。

例如,當繼承方式為 protected 時,那麼基類成員在派生類中的訪問許可權最高也為 protected,高於 protected 的會降級為 protected,但低於 protected 不會公升級。再如,當繼承方式為 public 時,那麼基類成員在派生類中的訪問許可權將保持不變。

也就是說,繼承方式中的 public、protected、private 是用來指明基類成員在派生類中的最高訪問許可權的。

2) 不管繼承方式如何,基類中的 private 成員在派生類中始終不能使用(不能在派生類的成員函式中訪問或呼叫)。

3) 如果希望基類的成員能夠被派生類繼承並且毫無障礙地使用,那麼這些成員只能宣告為 public 或 protected;只有那些不希望在派生類中使用的成員才宣告為 private。

4) 如果希望基類的成員既不向外暴露(不能通過物件訪問),還能在派生類中使用,那麼只能宣告為 protected。

注意,我們這裡說的是基類的 private 成員不能在派生類中使用,並沒有說基類的 private 成員不能被繼承。

實際上,基類的 private 成員是能夠被繼承的,並且(成員變數)會占用派生類物件的記憶體,它只是在派生類中不可見,導致無法使用罷了。

private 成員的這種特性,能夠很好的對派生類隱藏基類的實現,以體現物件導向的封裝性。

下表彙總了不同繼承方式對不同屬性的成員的影響結果

繼承方式/基類成員

public成員

protected成員

private成員

public繼承

public

protected

不可見protected繼承

protected

protected

不可見private繼承

private

private

不可見由於 private 和 protected 繼承方式會改變基類成員在派生類中的訪問許可權,導致繼承關係複雜,所以實際開發中我們一般使用 public。

【示例】演示類的繼承關係。

#include

using

namespace std;

//基類people

class

people

;

void people::

setname

(char

*name)

void people::

setage

(int age)

void people::

sethobby

(char

*hobby)

char

*people::

gethobby

()

//派生類student

class

student

:public people

;

void student::

setscore

(float score)

//派生類pupil

class

pupil

:public student

;

void pupil::

setranking

(int ranking)

void pupil::

display

()

int

main

()

執行結果:

小明的年齡是15,考試成績為92.5分,班級排名第4,ta喜歡桌球。

這是乙個多級繼承的例子,student 繼承自 people,pupil 又繼承自 student,它們的繼承關係為 people --> student --> pupil。pupil 是最終的派生類,它擁有基類的 m_name、m_age、m_score、m_hobby 成員變數以及 setname()、setage()、sethobby()、gethobby()、setscore() 成員函式。

注意,在派生類 pupil 的成員函式 display() 中,我們借助基類的 public 成員函式 gethobby() 來訪問基類的 private 成員變數 m_bobby,因為 m_hobby 是 private 屬性的,在派生類中不可見,所以只能借助基類的 public 成員函式 sethobby()、gethobby() 來訪問。

在派生類中訪問基類 private 成員的唯一方法就是借助基類的非 private 成員函式,如果基類沒有非 private 成員函式,那麼該成員在派生類中將無法訪問。

使用 using 關鍵字可以改變基類成員在派生類中的訪問許可權,例如將 public 改為 private、將 protected 改為 public。

注意:using 只能改變基類中 public 和 protected 成員的訪問許可權,不能改變 private 成員的訪問許可權,因為基類中 private 成員在派生類中是不可見的,根本不能使用,所以基類中的 private 成員在派生類中無論如何都不能訪問。

using 關鍵字使用示例:

#include

using

namespace std;

//基類people

class

people

;void people::

show

()//派生類student

class

student

:public people

;void student::

learning

()int

main

()

**中首先定義了基類 people,它包含兩個 protected 屬性的成員變數和乙個 public 屬性的成員函式。定義 student 類時採用 public 繼承方式,people 類中的成員在 student 類中的訪問許可權預設是不變的。

不過,我們使用 using 改變了它們的預設訪問許可權,如**第16~20行所示,將 say() 函式修改為 private 屬性的,是降低訪問許可權,將 name、age 變數修改為 public 屬性的,是提高訪問許可權。

因為 say() 函式是 private 屬性的,所以**第33行會報錯。把該行注釋掉,程式輸出結果為:

我是小明,今年16歲,這次考了99.5分!

C C 中的繼承許可權和繼承方式

這個很簡單,就是private都只能通過父類的函式去訪問,其他的都跟隨繼承方式掉級就可以了,用的最多的還是public繼承 c 繼承的一般語法為 class 派生類名 繼承方式 基類名 繼承方式限定了基類成員在派生類中的訪問許可權,包括 public 公有的 private 私有的 和 protec...

繼承,多繼承,多層繼承,許可權控制

繼承 子類可以使用父類的屬性和方法 子類在繼承的時候,在定義類的時候,填寫的是父類的名字 父類的屬性和方法,子類可以繼承並使用 父類 子類 基類 派生類 多繼承 子類可以繼承成多個父類的屬性和方法 mro 方法查詢順序 如果子類有方法則呼叫子類的方法,沒有則用父類的方法,父類找不到用object 多...

繼承許可權的問題

許可權修飾符 y表示可以訪問,n表示不可以訪問 成員修飾符 類自己相同包 不同包的子類 任意類public 公有的 yy yyprotected 保護 yy yn包 預設 yy nnprivate 私有的 yn nn乙個例子 許可權問題 父類p許可權a public 公有的 bprotected 保...