繼承就是在乙個已存在的類的基礎上建立乙個新的類,已存在的類稱為「基類」,或者叫父類。新建立的類稱為「派生類」,乙個新類從已有的類那裡獲得已有的特性,這種現象叫繼承。派生類繼承了父類的全部資料成員和成員函式。我們在建立了乙個類a後,之後可能還需要建立另乙個類b,但是類b是在類a的基礎上新增了一些東西,可能只是新增了乙個資料成員或者成員函式,顯然這很費時費力,這種重複的工作量是很大的,效率較低,而物件導向強調的是軟體的可重用性,所以c++語言提供了類的繼承機制,解決了軟體的可重用性。
一、類之間的關係
1、繼承:在已有類的基礎上建立新類的過程
2、乙個 b 類繼承a類,或稱從類 a 派生類 b
類 a 稱為基類(父類),類 b 稱為派生類(子類)
二、 基類和派生類
1、類繼承關係的語法形式
class 派生類名 : 基類名錶
;2、基類名錶 構成
訪問控制 基類名1, 訪問控制 基類名2 ,… , 訪問控制 基類名n
訪問控制
:表示派生類對基類的繼承方式,使用關鍵字:
public 公有繼承
private 私有繼承
protected 保護繼承
3、派生類的生成過程
派生類的生成過程經歷了三個步驟:
●吸收基類成員(全部吸收(構造、析構除外),但不一定可見)
●改造基類成員
●新增派生類新成員
(1) 吸收基類成員
在c++的繼承機制中,派生類吸收基類中除建構函式和析構函式之外的全部成員。
(2) 改造基類成員
通過在派生類中定義同名成員(包括成員函式和資料成員)來遮蔽(隱藏)在派生類中不起作用的部分基類成員
(3) 新增新成員
僅僅繼承基類的成員是不夠的,需要在派生類中新增新成員,以保證派生類自身特殊屬性和行為的實現。
4、重名成員
(1)派生類定義了與基類同名的成員,在派生類中訪問同名成員時遮蔽(hide)了基類的同名成員
(2)在派生類中使用基類的同名成員,顯式地使用類名限定符:
類名 :: 成員
5、派生類中訪問靜態成員
(1)基類定義的靜態成員,將被所有派生類共享(基類和派生類共享基類中的靜態成員)
(2) 根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質
(3) 派生類中訪問靜態成員,用以下形式顯式說明:
類名 :: 成員
或通過物件訪問
物件名 . 成員
三、 基類的初始化
1、在建立派生類物件時用指定引數呼叫基類的建構函式來初始化派生類繼承基類的資料
2、派生類建構函式宣告為
派生類建構函式 ( 變元表
) :
基類 (
變元表
) ,
物件成員
1( 變元表
)… 物件成員n (
變元表 ) ;
3、建構函式執行順序:基類 à 物件成員à 派生類
4、派生類建構函式和析構函式的使用原則
(1)基類的建構函式和析構函式不能被繼承
(2)如果基類沒有定義建構函式或有無參的建構函式,
派生類也可以不用定義建構函式
(3)如果基類無無參的建構函式,派生類必須定義建構函式
(4)如果派生類的基類也是派生類,則每個派生類只負責直接基類的構造
(5)派生類是否定義析構函式與所屬的基類無關
5、派生類的建構函式的定義
(1)派生類的資料成員既包括基類的資料成員,也包括派生類新增資料成員。
(2)在c++中
,派生類建構函式的一般格式為
:派生類::派生類名
(引數總表
):基類名
(參數列
)注意:這是基類有建構函式且含有引數時使用
6、派生類析構函式
(1)當派生類中不含物件成員時
在建立派生類物件時,建構函式的執行順序是:基類的建構函式→派生類的建構函式;
在撤消派生類物件時,析構函式的執行順序是:派生類的析構函式→基類的析構函式。
(2)當派生類中含有物件成員時
在定義派生類物件時,建構函式的執行順序:基類的建構函式→物件成員的建構函式→派生類的建構函式;
在撤消派生類物件時,析構函式的執行順序:派生類的析構函式→物件成員的析構函式→基類的析構函式。
四、、多繼承
1、乙個類有多個直接基類的繼承關係稱為多繼承
2、多繼承宣告語法
class 派生類名
: 訪問控制 基類名
1 ,
訪問控制 基類名
2 ,
… ,
訪問控制 基類名n;
3、多繼承的派生類構造和訪問
(1)多個基類的派生類建構函式可以用初始式呼叫基類建構函式初始化資料成員。
(2)執行順序與單繼承建構函式情況類似。多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。
(3)乙個派生類物件擁有多個直接或間接基類的成員。不同名成員訪問不會出現二義性。如果不同的基類有同名成員,派生類物件訪問時應該加以識別。
4、多繼承的建構函式
派生類名(引數總表
):基類名
1(參數列
1),基類名
2(參數列
2),…
,基類名
n(參數列
n)5、多繼承方式下建構函式的執行順序:
(1)先執行所有基類的建構函式
(2)再執行物件成員的建構函式
(3)最後執行派生類的建構函式
(4)處於同一層次的各基類建構函式的執行順序取決於定義派生類時所指定的基類順序
(5)與派生類建構函式中所定義的成員初始化列表順序沒有關係。
內嵌物件成員的建構函式執行順序與物件在派生類中宣告的順序一致
6、多繼承的析構函式
(1)析構函式名同樣與類名相同,無返回值、無引數,而且其定義方式與基類中的析構函式的定義方式完全相同。
(2)功能是在派生類中對新增的有關成員進行必要的清理工作。
(3)析構函式的執行順序與多繼承方式下建構函式的執行順序完全相反,首先對派生類新增的資料成員進行清理,再對派生類物件成員進行清理,最後才對基類繼承來的成員進行清理。
7、賦值相容規則
(1)賦值相容規則指在程式中需要使用基類物件的任何地方,都可以用公有派生類的物件來替代。
(2)賦值相容規則中所指的替代包括以下的情況:
a 派生類的物件可以賦給基類物件
b 派生類的物件可以初始化基類的引用
c 派生類的物件的位址可以賦給基類型別的指標
(3)賦值相容的可行性
通過公有繼承
派生類得到了除了構造、析構函式以外的所有成員
且這些成員的訪問控制屬性也和基類完全相同。
這樣,它便具備了基類的所有功能。
利用賦值相容規則
a 派生類的物件可以賦給基類物件
(強制型別轉換
)b 派生類的物件可以初始化基類的引用
c 派生類的物件的位址可以賦給基類型別的指標
例,下面宣告的兩個類
:class base;
class derived:public base;
根據賦值相容規則, 以下幾種情況是合法的
:(1) 可以用派生類物件給基類物件賦值。例如
:base b;
derived d;
b=d;
這樣賦值的效果是,物件
b中所有資料成員都將具有物件
d中對應資料成員的值。
(2) 可以用派生類物件來初始化基類的引用。例如
:derived d;
base &br=d;
(3) 可以把派生類物件的位址賦值給指向基類的指標。例如
:derived d;
base *bptr=&d;
這種形式的轉換,是在實際應用程式中最常見到的。
(4) 可以把指向派生類物件的指標賦值給指向基類物件的指標。例如
:derived *dptr,obj; dptr=&obj;
base *bptr=dptr;
(8)賦值相容規則的特點
在替代之後,派生類物件就可以作為基類的物件使用,但只能使用從基類繼承的成員。
繼承學習總結
讓子類的原型物件指向父類的例項,當子類的例項找不到對應的方法時,就按原型鏈往上找。function parent 原型上掛載方法 parent.prototype.getname function function chind 原型鏈繼承 chind.prototype new parent 原型鏈...
c 繼承學習總結
繼承 在已有類的基礎上創造新類。其中已有類稱為基類或父類,創造出的新類稱為派生類或子類。繼承的格式為 class 派生類名 基類名。繼承的型別我們一般都是使用公有繼承。在繼承時需要將基類的資料成員宣告為保護型別,因為派生類無法直接使用基類的私有成員。派生類中包括了基類中的所有成員 除建構函式和析構函...
繼承 多型 抽象 學習總結
1.為什麼要使用繼承 是為了減少重複的 讓我們的功能得以擴充套件。2.抽象方法的特點是什麼 a.抽象方法沒有方法體 b.有抽象方法的類必須是抽象類 c.抽象方法前面必須要加abstract。3.抽象類有哪些特點 a.抽象類都是父類,他的下面有子類 b.不能被例項化,只能被繼承 4.繼承抽象類時需要注...