第六章 繼承和派生

2021-08-31 17:52:42 字數 3049 閱讀 7301

第六章 

繼承和派生

6.1 繼承和派生的基本概念

這種通過特殊化已有的類來建立新類的過程,叫做「類的派生」,原來的類叫做「基類」,新建立的類則叫做「派生類」。另一方面,從類的成員角度看,派生類自動地將基類的所有成員作為自己的成員,這叫做「繼承」。基類和派生類又可以分別叫做「父類」和「子類」,有時也稱為「一般類」和「特殊類」。

從乙個或多個以前定義的類(基類)產生新類的過程稱為派生,這個新類稱為派生類。派生的新類同時也可以增加或者重新定義資料和操作,這就產生了類的層次性。

類的繼承是指派生類繼承基類的資料成員和成員函式。繼承常用來表示類屬關係,不能將繼承理解為構成關係。

當從現有的類中派生出新類時,派生類可以有以下幾種變化:

(1)增加新的成員(資料成員或成員函式)

(2)重新定義已有的成員函式

(3)改變基類成員的訪問許可權

c++派生類使用兩種基本的物件導向技術:第一種稱為性質約束,即對基類的性質加以限制;第二種稱為性質擴充套件,即增加派生類的性質。

c++中有兩種繼承:單一繼承和多重繼承。對於單一繼承,派生類只能有乙個基類;對於多重繼承,派生類可以有多個基類。

6.2 單一繼承

6.2.1 單一繼承的一般形式

在c++,宣告單一繼承的一般形式如下:

class 派生類名:訪問控制 基類名;

這裡和一般的類宣告一樣,用關鍵字class宣告乙個新的類。冒號後面的部分指示這個新類是哪個基類的派生類。所謂「訪問控制」是指如何控制基類成員在派生類中的訪問屬性。它是3個關鍵字public、private、protected中的乙個。一對大括號「{}」是用來宣告派生類自己的成員的。

6.2.2 派生類的建構函式和析構函式

定義派生類的建構函式的一般形式如下:

派生類名::派生類名(參數列0) : 基類名(參數列)

冒號後「基類名(參數列)」稱為成員初始化列表,參數列給出所呼叫的基類建構函式所需要的實參。實參的值可以來自「參數列0」,或由表示式給出。

建構函式(包括析構函式)是不被繼承的,所以乙個派生類只能呼叫它的直接基類的建構函式。當定義派生類的乙個物件時,首先呼叫基類的建構函式,對基類成員進行初始化,然後執行派生類的建構函式,如果某個基類仍是乙個派生類,則這個過程遞迴執行。該物件消失時,析構函式的執行順序和執行建構函式的順序正好相反。

6.2.3 類的保護成員

c++語言規定,使用公有方式產生的派生類成員函式可以直接訪問基類中定義的或從另乙個基類繼承來的公有成員,但不能訪問基類的私有成員。

在類的宣告中,關鍵字protected之後宣告的是類的保護成員。保護成員具有私有成員和公有成員的雙重角色;對派生類的成員函式而言,它是公有成員,可以被訪問;而對其他函式而言則仍是私有成員,不能被訪問。

6.2.4 訪問許可權和賦值相容規則 1.

公有派生和賦值相容規則

在公有派生的情況下,基類成員的訪問許可權在派生類中保持不變。這就意味著:

(1)基類的公有成員在派生類中依然是公有的。

(2)基類的保護成員在派生類中依然是保護的。

(3)基類的不可訪問的和私有的成員在派生類中也仍然時不可訪問的。

當希望類的某些成員能夠被派生類所訪問,而又不能被其他的外界函式訪問的時候,就應當把它們定義為保護的。

所謂賦值相容規則是指在公有派生情況下,乙個派生類的物件可以作為基類的物件來使用的情況。

注意:靜態成員可以被繼承,這時基類物件和派生類的物件共享該靜態成員。 2.

「isa」和「has-a」的區別

類與類之間的關係有兩大類:一是繼承和派生問題,二是乙個類使用另乙個類的問題。後者的簡單用途是把另乙個類的物件作為自己的資料成員或者成員函式的引數。

對於繼承,首先要掌握公有繼承的賦值相容規則,理解公有繼承「就是乙個(isa)」的含義。

分層也可以叫做包含、嵌入或者聚合。公有繼承的意思是「isa」。與此相反,分層的意思是指「has-a(有乙個)」。 3.

公有繼承訪問許可權表

注意:靜態成員可以被繼承,這時,基類物件和派生類的物件共享該靜態成員。 4.

私有派生

通過私有派生,基類的私有和不可訪問成員在派生類中是不可訪問的,而公有和保護成員這時就成了派生類的私有成員,派生類的物件不能訪問繼承的基類成員,必須定義公有的成員函式作為介面。更重要的是,雖然派生類的成員函式可通過定義自定義的函式訪問基類的成員,但將派生類作為基類在繼續派生時,這時即使使用公有派生,原基類公有成員在新的派生類中也將是不可訪問的。 5.

保護派生

派生也可以使用protected。這種派生使原來的許可權都降一級使用,即private變為不可訪問;protected變為private;public變為protected。因為限制了資料成員和成員函式的訪問許可權,所以用的比較少。它與private繼承的主要區別在於下一級的派生中。

6.3 多重繼承

乙個類從多個基類派生的一般形式如下:

class 類名1:訪問控制 類名2,訪問控制 類名3,...,訪問控制 類名n ;

6.4 二義性及其支配規則

對基類成員的訪問必須是無二義性的,如使用乙個表示式的含義能解釋為可訪問多個基類中的成員,則這種對基類成員的訪問就是不確定的,稱這種訪問具有二義性。

6.4.1 作用域分辨符和成員名限定

從類中派生其他類可能導致幾個類使用同乙個成員函式名或資料成員名。程式必須確切地告訴編譯器使用哪個版本的資料成員或成員函式。

如果基類中的名字在派生類中再次宣告,則派生類中的名字隱藏了基類中的相應名字。c++可以迫使編譯器「看到」當前作用域的外層部分,訪問那些被隱藏的名字,這是由作用域分辨運算子「::」實現的(簡稱作用域運算子)。這一過程叫做作用域分辨。作用域分辨操作的一般形式如下:

類名::識別符號

「類名」可以是任意基類或派生類名,「類識別符號」是該類中宣告的任一成員名。

6.4.2 派生類支配基類的同名函式

基類的成員和派生類新增的成員都具有類作用域,基類在外層,派生類在內層。如果這時派生類定義了乙個和基類成員函式同名的新成員函式(因為引數不同屬於過載,所以這裡是指具有相同參數列的成員函式),派生類的新成員函式就覆蓋了外層的同名成員函式。在這種情況下,直接使用成員函式名只能訪問派生類的成員函式,只有使用作用域分辨,才能訪問基類的同名成員函式。

派生類d中的名字n支配基類b中同名的名字n,稱為名字支配規則。

第六章繼承和多型

二 方法覆蓋和多型 三 終極類與抽象類 1 is a 關係public class employee public class manager2 extends關鍵字 3 object類 4 單重繼承 5 物件轉型 casting 向上轉型 employee e new manager 子類mana...

c 複習第六章 繼承

原因 通過繼承機制可以利用已有的資料型別來定義新的資料型別,新的類不僅擁有舊類的成員,還擁有新定義的成員。乙個b類繼承於a類,或稱從類a派生類b。這樣的話,類a成為基類 父類 類b成為派生類 子類 派生類中的成員,包含兩大部分 一類是從基類繼承過來的,一類是自己增加的成員。從基類繼承過過來的表現其共...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...