派生類與繼承(C 學習筆記 31)

2021-09-02 08:14:58 字數 4432 閱讀 5861

繼承,就是從先輩處得到屬性和行為特徵,類的繼承就是新的類從已有類那裡得到已有的特性。

類的派生,即可看作從已有類產生新類的過程。由已有類產生新類時,新類便包含了已有類的特徵,同時也可以加入自己的新特性。

③ 已有類稱為基類父類,產生的新類稱為派生類子類。派生類同樣也可以作為基類派生出新的類,這樣就形成了類的層次結構。

④ 類的繼承和派生,使程式設計師無需修改已有類,只需在已有類的基礎上,通過增加少量**或修改少量**的方法得到新的類,從而較好的解決**重用的問題。

宣告乙個派生類的一般格式為:

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

這裡的 「基類名」 是乙個已經宣告的類的名稱,「派生類名」 是繼承原有類的特性而生成的新類的名稱。「繼承方式」 規定了如何訪問從基類繼承的成員,它可以是關鍵字 private,protected 或 public,分別表示私有繼承,保護繼承和公有繼承,如果不顯式地給出繼承方式關鍵字,系統預設為私有繼承。類的繼承方式指定了派生類成員以及類外物件對於從基類繼承來的成員的訪問許可權。

例 1 :現有乙個 person 類,包含 name(姓名)、age(年齡)、***(性別)等資料成員與成員函式 print:

#include

using

namespace std;

class

person

protected

://保護成員可以被本類的成員函式訪問,也可以被本類的派生類的成員函式訪問

string name;

int age;

char ***;

};

要宣告乙個 employee 類,它包含有 name(姓名)、age(年齡)、***(性別)、department(部門)及 salary(工資)等資料成員與成員函式 print1,如下所示:

class

employee

:public person

private

: string department;

//新增加的資料成員

float salary;

//新增加的資料成員

};

實際上,並不是把基類的成員和派生類新增加的成員簡單地加在一起就構成了派生類。構造乙個派生類一般包括以下 3 部分工作:

(1)派生類從基類接收成員

在 c++ 的類繼承中,派生類把基類的全部成員(除建構函式和析構函式之外)接收過來。

(2)調整從基類接收的成員

派生類不能對接收基類的成員進行選擇,但是可以對這些成員進行某些調整。對基類成員的調整包括兩個方面:

① 改變基類成員在派生類中的訪問屬性,這主要是通過派生類宣告時的繼承方式來控制的。

② 派生類可以對基類的成員進行重定義,即在派生類中宣告乙個與基類成員同名的成員,則派生類中的新成員會覆蓋基類的同名成員,這時在派生類中或者通過派生類物件,直接使用成員名就只能訪問到派生類中宣告的同名成員。

注意:在 ② 中,如果是成員函式,不僅應使函式名相同,而且函式的參數列也應相同,如果不相同,則稱派生類過載了基類的成員函式,而不是覆蓋了基類的同名函式。

(3)在派生類中增加新的成員

這體現了派生類對基類功能的擴充套件,是繼承和派生機制的核心,來實現必要的新增功能。

由於在繼承過程中,基類的建構函式和析構函式是不能被繼承的,因此在宣告派生類時,一般需要在派生類中定義新的建構函式和析構函式(當然,如果沒有定義則會呼叫系統自動預設生成的建構函式和析構函式)。

類的繼承方式有 public(公有繼承)、protected(保護繼承)和 private(私有繼承)3種,不同的繼承方式導致不同訪問屬性的基類成員在派生類中的訪問屬性也不同。

在派生類中,從基類繼承來的成員可以按訪問屬性劃分為 4 種:不可直接訪問,公有(public),保護(protected)和私有(private)。

基類中的成員

在公有派生類中的訪問屬性

在私有派生類中的訪問屬性

在保護派生類中的訪問屬性

私有成員

不可直接訪問

不可直接訪問

不可直接訪問

公有成員

公有私有

保護保護成員

保護私有

保護例如,當類的繼承方式為私有繼承時,基類中的所有公有成員在派生類中都以私有成員的身份出現。

基類的成員可以有 public(公有)、protected(保護)和 private(私有)3種訪問屬性,基類的成員函式可以訪問基類中其他成員,但是在類外通過基類的物件,就只能訪問該基類的公有成員。

我們知道類的繼承方式有 public(公有繼承)、protected(保護繼承)和 private(私有繼承)3種。不同的繼承方式導致原來具有不同訪問屬性的基類成員在派生類中的訪問屬性也有所不同。

派生類對基類成員的訪問形式主要有以下兩種:

(1)內部訪問。由派生類中新增的成員函式對基類繼承來的成員的訪問。

(2)物件訪問。在派生類外部,通過派生類的物件對從基類繼承來的成員的訪問。

當類的繼承方式為私有繼承時,基類的公有成員和保護成員被繼承後作為派生類的私有成員,派生類的成員函式可以直接訪問它們,但是在類外部通過派生類的物件無法訪問。

基類的私有成員不允許派生類繼承,因此在私有派生類中是不可直接訪問的,所以無論是派生類成員函式還是通過派生類的物件,都無法直接訪問從基類繼承來的私有成員。

私有繼承的訪問規則:

基類中的成員

私有成員

公有成員

保護成員

內部訪問

不可訪問

可訪問可訪問

物件訪問

不可訪問

不可訪問

不可訪問

例 1:私有繼承的訪問規則

#include

using

namespace std;

class

base

void

showx()

private

:int x;};

class

derived

:private base

void

showxy()

};intmain()

例 2:私有繼承的訪問規則2
#include

using

namespace std;

class

base

void

showa()

};class

derive01

:private base

void

showab()

};class

derive02

:private derive01

void

showabc()

};intmain()

基類中的成員

私有成員

公有成員

保護成員

內部訪問

不可訪問

可訪問可訪問

物件訪問

不可訪問

可訪問不可訪問

例 3:公有繼承的訪問規則舉例

#include

using

namespace std;

class

base

void

showxy()

};class

derived

:public base

void

showxyz()

};intmain()

基類中的成員

私有成員

公有成員

保護成員

內部訪問

不可訪問

可訪問可訪問

物件訪問

不可訪問

不可訪問

不可訪問

例 4:保護繼承的訪問規則舉例

#include

using

namespace std;

class

base

intgetx()

};class

derived

:protected base

;void derived::

setall

(int a,

int b,

int c,

int d,

int e,

int f)

void derived::

show()

intmain()

C 學習筆記 類的繼承(派生類)

1 引言 馬克思說 世界是聯絡的,哈哈。搞笑了。進入正題,現實中的乙個概念不是鼓勵存在的,總是與一些相關的概念存在的,他們之間總是相互聯絡的,而且他們之間會表現出一種層次的關係,共性 層次 我們就引出了派生類的概念。2 派生類 1 employee與manager struct employee s...

C 繼承和派生類

繼承和派生類 繼承性是物件導向程式設計中最重要的機制。這種機制提供了無限重複利用程式資源的一種途徑。通過c 語言中的繼承機制,可以擴充和完善舊的程式設計以適應新的需求。這樣不僅可以節省程式開發的時間和資源,並且為未來程式增添了新的資源。class student class studend1 利用原...

C 學習之繼承1 基類與派生類

物件導向程式設計oop object oriented programming 的關鍵思想是多型性。c 中多型性用於通過繼承而相關聯的型別的引用或指標。首先看看基本的基類和派生類,以c primer中乙個程式段為例 在基類item base中我們可以看到,這裡面存在public protected和...