C++面向物件程式設計——繼承與派生
阿新 • • 發佈:2019-01-29
什麼是繼承與派生:
在C++中可重用性是通過“繼承”這一機制來實現的,因此繼承是C++的一個重要的組成部分。
宣告派生類的一般形式為:
class 派生類名 : [繼承方式] 基類名
{
派生類新增加的成員
};
派生類的構成:派生類中的成員包括從基類繼承過來的成員和自己增加的成員兩大部分。
基類成員在派生類成員的訪問屬性:
public繼承方式:
private->不可訪問,public->public,protected->protected。
private繼承方式:
private->不可訪問,public->private,protected->privated。
protected繼承方式:
private->不可訪問,public->protected,protected->protected。
private和protected繼承方式的區別:在多級派生時protected繼承可以使得基類的成員仍然可以在派生類中訪問,而private繼承不能。
派生類的建構函式和解構函式:
基類的建構函式是不能被繼承到派生類的,因此對基類的初始化工作也要由派生類的建構函式承擔。
派生類建構函式一般形式為:
派生類建構函式名( 引數表 ):基類建構函式名( 引數表 ),子物件名(引數表) //這裡呼叫基類的建構函式
{ 派生類中新增資料成員初始化語句 }
在建立和釋放一個物件時,執行建構函式和解構函式的順序:
派生類建構函式先呼叫基類建構函式,呼叫子物件建構函式,再執行派生類建構函式本身。
在派生類物件釋放時,先執行派生類的解構函式,然後呼叫子物件的解構函式,再執行其基類的解構函式。
多重繼承:當一個派生類有兩個或者多個基類派生類從兩個或多個基類中繼承所需要的屬性,這種行為稱為多重繼承。
多重繼承派生類的建構函式:
派生類建構函式名(總引數表):基類1建構函式(引數表),基類2建構函式(引數表)
{ 派生類中新增資料成員成員初始化語句 }
在派生類中基類的同名成員被遮蔽,成為不可見的,也就是說派生類新增加的同名成員覆蓋了基類中的同名成員。
虛基類:使得在繼承間接共同基類時只保留一份成員。
如果一個派生類有多個直接基類,而這些基類又有一個共同的基類,則在最終派生類中會保留該間接共同基類資料成員的多份同名成員。這使得儲存空間佔用過多,還使得訪問這些成員時變得更困難。
宣告虛基類的一般形式:
class 派生類名:virtual 繼承方式 基類名
經過這樣的聲明後,當基類通過多條派生路徑被一個派生類繼承時,該派生類只繼承該基類一次,也就是說基類成員只保留一次。
*注意為了保證虛基類在派生類中只繼承一次,應當在該基類的所有直接派生類中宣告為虛基類。否則任然會出現對基類的多次繼承。
在最後的派生類中不僅要負責對其直接基類進行初始化,還要負責對虛基類初始化。
example:
class A
{ A(int i){ } ...;}
class B: virtual public A //A作為B的虛基類
{ B(int n):A(n){} ...; }
class C: virtual public A //A作為C的虛基類
{ C(int n):A(n){} ...; }
class D: public B,public C
{ D(int n):A(n),B(n),C(n){} //對所有基類初始化
...; }
基類與派生類的轉換:
1、只有公有派生類才是基類真正的子型別,它完整地繼承了基類的功能。
2、派生類物件可以向基類物件賦值。且只能用子物件對其基類進行賦值,而不能用基類對其子物件賦值。同一基類的不同派生物件之間也不能賦值。因為基類或者其他派生物件中不包含 要用於賦值的派生類中的某些的成員。
3、派生類物件可以替代基類物件向基類物件的引用進行賦值或者初始化。
4、如果函式的引數是基類物件或者基類物件的引用,則相應的實參可以用子類物件。
5、指向基類物件的指標也可以指向派生類物件。但是隻能訪問派生類對像中的基類成員,而不能訪問派生類增加的成員。
繼承與組合:
在一個類中以另一個類的物件作為資料成員,稱為類的組合。
通過繼承建立了派生類與基類的關係,它是一種是的關係,如黑貓是貓,白描也是貓。
通過組合建立了成員類與組合類的關係,它們之間是有的關係,如教授有一個生日。