標籤:
-繼承和派生
一繼承(繼承就是從先輩處得到屬性和行為特徵)
1 衍生類別的聲明
class 衍生類別名∶[繼承方式] 基類名
{
衍生類別新增的資料成員和成員函數
};
2 基類成員在衍生類別中的訪問屬性
3 衍生類別對基類成員的訪問規則1)內部訪問 由衍生類別中新增的成員函數對基類繼承來的成員的訪問2)對象訪問 在衍生類別外部,通過衍生類別的對象對從基類繼承來的成員的訪問3)
1. 私人繼承的訪問規則
2)公有繼承的訪問規則
.
3)保護繼承的訪問規則
4 衍生類別的建構函式和解構函式
1)
衍生類別建構函式和解構函式的執行順 序
當建立衍生類別對象時:
基類的建構函式---衍生類別的建構函式;
當撤消衍生類別對象時:
衍生類別的解構函式---基類的解構函式。
注:當基類含有帶參數的建構函式時,衍生類別必須定義建構函式,並綴上“:基類名(參數表) ”,以提供把參數傳遞給基類建構函式的途徑。
衍生類別建構函式的一般格式為
衍生類別名(參數總表):基類名(參數表)
{
衍生類別新增成員的初始化語句
}
說明: (1)可以將衍生類別建構函式定義在類的外部,而在類體內唯寫該函數的聲明
(2) 若基類使用不帶參數的建構函式或帶預設參數的建構函式,則在衍生類別中定義建構函式時可略去“∶基類(參數表)”;
(3)如果衍生類別的基類也是一個衍生類別,每個衍生類別只需負責其直接基類的構造,依次上溯
(4) 在執行衍生類別的解構函式時,系統會自動調用基類的解構函式,對基類的對象進行清理
問題:當衍生類別中含有對象成員時,其建構函式應該如何構造?
當衍生類別中含有對象成員時,其建構函式的一般形式為:
衍生類別名(參數總表):基類名(參數表0),對象名成員1(參數表1),…,對象成員名n (參數表n)
{
//衍生類別新增成員的初始化語句 ..
}
即
定義衍生類別對象時,建構函式的執行順序如下:
·調用基類的建構函式;
·調用對象成員的建構函式;
·執行衍生類別的建構函式體。
撤消對象時,解構函式的調用順序與建構函式的調用順序正好相反。
.調用衍生類別的解構函式;
. 調用對象成員的解構函式;
. 調用基類的解構函式
5 調整基類成員在衍生類別中的訪問屬性的其他方法
1)同名成員(C++語言允許在衍生類別中說明的成員與基類中的成員名字相同)
為了在衍生類別中使用基類的同名成員,必須在該成員名之前加上基類名和範圍標 識符“::”,
? 能否使私人繼承的衍生類別的對象訪問基類的公有成員或保護成員
訪問聲明:
把基類的保護成員名或公有成員名直接寫到私人衍生類別定義式中的同名段中,
同時在成員名前冠以“基類名∷”
例如:
#include<iostream.h>
class A{
int x;
public:
A(int x1){x=x1;}
void print( ){cout<<"x="<<x;} };
class B: private A{
int y;
public:
B(int x1,int y1):A(x1){y=y1;}
A::print; //訪問聲明
};
main( )
{ B b(10,20);
b.print( );
return 0; }
說明:(1)訪問聲明中只能含不帶類型和參數的函數名或變數名
(2) 資料成員也可以使用訪問聲明
(3) 訪問聲明不能改變類成員在基類中原來的性質
二 多繼承與虛基類
1 多繼承(當一個衍生類別具有多個基類時,這種派生方法稱為多基派生或多繼承)
多重繼承聲明的一般形式如下:
class 衍生類別名:繼承方式1 基類名 1,…, 繼承方式n 基類名n
{
衍生類別新增的資料成員和成員函數
};
2 多繼承衍生類別的建構函式與解構函式
多繼承建構函式定義的一般形式如下:
衍生類別名(參數總表):基類名1(參數表1),基類名2(參數表2),…,基類名n(參數表)
{
衍生類別新增成員的初始化語句
}
註:
多繼承建構函式的執行順序與單繼承建構函式的執行順序相同:
· 先執行基類的建構函式;
· 再執行對象成員的建構函式;
· 最後執行衍生類別建構函式。
解構函式的執行順序則剛好與建構函式的執行順序相反。
3 虛基類
1)作用
如果一個衍生類別是從多個基類派生出來的,而這些基類又有一個共同的基類,
則在這個衍生類別中訪問這個共同的基類中的成員時,可能會產生二義性
所以引入虛基類 使從不同的路徑繼承的基類的成員在記憶體中只擁有一個拷貝
C++複習筆記--繼承和派生