1. 程式人生 > >C++中繼承和派生詳解(公有、私有、保護繼承的區別)

C++中繼承和派生詳解(公有、私有、保護繼承的區別)

繼承和派生概述:

  • 繼承和派生是同一個過程從不同角的度看

    • 保持已有類的特性而構造新類的過程稱為繼承。

    • 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。

  • 被繼承的已有類稱為基類(或父類)。

  • 派生出的新類稱為派生類(或子類)。

  • 直接參與派生出某類的基類稱為直接基類。

  • 基類的基類甚至更高層的基類稱為間接基類。

派生的目的

  • 當新的問題出現,原有程式無法解決(或不能完全解決)時,需要對原有程式進行改造。

派生類的構成:

  • 吸收基類成員

  • 改造基類成員

  • 新增新的成員

吸收基類成員:

  • 預設情況下派生類包含了全部基類中除構造和解構函式之外的所有成員。

  • c++11規定可以用using語句繼承基類建構函式。

改造基類成員:

  • 如果派生類宣告一個和某基類成員同名的新成員,派生的新成員就隱藏或覆蓋了外層同名成員。

新增新的成員:

  • 派生類增加新成員使派生類在功能上有所發展。

繼承方式

不同繼承方式的影響主要體現在:

  • 派生類成員對基類成員的訪問許可權;

  • 通過派生類物件對基類成員的訪問許可權。

三種繼承方式:

  • 公有繼承

  • 私有繼承

  • 保護繼承

公有繼承(public):

  • 繼承的訪問控制

    • 基類的public和protected成員:訪問屬性在派生類中保持不變;

    • 基類的private成員:不可直接訪問

  • 訪問許可權

    • 派生類中的成員函式:可以直接訪問基類中的publicprotected成員,但不能直接訪問基類的private成員;

    • 通過派生類的物件:只能訪問public成員。

舉例:

定義一個點類(Point)

定義一個矩形類(Rectangle)

私有繼承(private)

  • 繼承的訪問控制:

    • 基類的public和protected成員:都以private身份出現在派生類中

    • 基類的private成員:不可直接訪問。

  • 訪問許可權:

    • 派生類中的成員函式:可以直接訪問基類中的publicprotected成員,但不能直接訪問基類的private成員;

    • 通過派生類的物件:不能直接訪問從基類繼承的任何成員。

舉例

保護繼承(protected)

  • 繼承的訪問控制

    • 基類的public和protected成員:都以protected身份出現在派生類中

    • 基類的private成員:不可直接訪問

  • 訪問許可權

    • 派生類中的成員函式:可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員;

    • 通過派生類的物件:不能直接訪問從基類繼承的任何成員。

protected成員的特點與作用

  • 對建立所在類物件的模組來說,它與private成員的性質相同。

  • 對於其派生類來說,它與public成員的性質相同。

  • 既實現了資料隱藏,有方便繼承,實現程式碼重用。

多繼承舉例

//公有繼承                      物件訪問    成員訪問

public    -->  public              Y         Y

protected -->  protected     N         Y

private   -->  private             N         N

//保護繼承                      物件訪問    成員訪問

public    -->  protected           N         Y

protected -->  protected        N         Y

private   -->  protected           N         N

//私有繼承                      物件訪問    成員訪問

public    -->  private             N         Y

protected -->  private          N         Y

private   -->  private             N         N