類的繼承與派生
繼承的概念
使用基類派生新類時(shí),除構(gòu)造函數(shù)和析構(gòu)函數(shù)外 者冤,基類的所有成員自動成為派生類的成員淮蜈,包括基類的成員變量和成員函數(shù)哺窄。
派生類可以 重新定義或修改 基類中已有的成員般婆,包括可以改變基類中成員的 訪問權(quán)限 到腥。
派生類的定義和大小
派生類的定義:
class 基類名
{
};
class 派生類名: public 基類名
{
};
存儲空間的計(jì)算:派生類對象 = 基類成員 + 派生類成員 。
使用 sizeof()
函數(shù)可以計(jì)算對象占用的存儲空間蔚袍。
繼承關(guān)系的特殊性
基類的友元類或友元函數(shù) 乡范,派生類 不會繼承 。
基類是某類的友元類页响,則派生類也是某類的友元類篓足。
基類的成員函數(shù)是某類的友元函數(shù),則派生類繼承的成員函數(shù)也是某類的友元函數(shù)闰蚕。
基類的靜態(tài)屬性隨靜態(tài)成員被繼承栈拖,即:靜態(tài)屬性被繼承。
派生類通過使用 <類名>::<成員名>
的方式引用或調(diào)用靜態(tài)成員没陡。
有繼承關(guān)系的類之間的訪問
使用 ::
作用域標(biāo)識符涩哟,可以訪問基類的非私有成員。
// 在派生類的成員函數(shù)中訪問
<基類名>::<成員變量名>; // 基類的成員變量
<基類名>::<成員函數(shù)名>(); // 基類的成員函數(shù)
// 派生類的對象訪問
<派生類對象名>.<基類名>::<成員變量名>;
<派生類對象名>.<基類名>::<成員函數(shù)名>();
protected 訪問范圍說明符
基類中的保護(hù)成員可以在派生類的成員函數(shù)中被訪問盼玄。
在基類中贴彼,一般都將 需要隱藏的成員 說明為保護(hù)成員而非私有成員。
多重繼承
一個(gè)類從多個(gè)基類派生的一般格式:
class 派生類名: 繼承方式說明符 基類名1, 繼承方式說明符 基類名2
{
類體
};
如果派生類中新增了同名成員埃儿,則派生類成員將 隱藏 所有基類的同名成員器仗。
當(dāng)派生類通過多重繼承的形式,繼承了多個(gè)基類童番,且多個(gè)基類中擁有同名成員精钮,需要使用 作用域標(biāo)識符 ::
來避免二義性。
訪問控制
設(shè)計(jì)繼承類時(shí)剃斧,需要使用 繼承方式說明符 指明派生類的繼承方式轨香。
繼承方式說明符:public
、private
幼东、protected
臂容。
公有繼承
繼承方式說明符:public
。
當(dāng)一個(gè)類派生自 公有 基類時(shí)根蟹,基類的 公有 成員也是派生類的 公有 成員脓杉,基類的 保護(hù) 成員也是派生類的 保護(hù) 成員,基類的 私有 成員 不能 直接被派生類訪問简逮,但是可以通過調(diào)用基類的公有和保護(hù)成員來訪問丽已。
私有繼承
繼承方式說明符:private
。
當(dāng)一個(gè)類派生自 私有 基類時(shí)买决,基類的 公有 和 保護(hù) 成員將成為派生類的 私有 成員沛婴。
保護(hù)繼承
繼承方式說明符:protected
吼畏。
當(dāng)一個(gè)類派生自 保護(hù) 基類時(shí),基類的 公有 和 保護(hù) 成員將成為派生類的 保護(hù) 成員嘁灯。
類型兼容規(guī)則
類型兼容規(guī)則是指需要基類對象的任何地方泻蚊,都可以使用公有派生類的對象來代替,也稱為 賦值兼容規(guī)則 丑婿。
在 公有 派生的前提下性雄,有以下3條兼容規(guī)則:
- 派生類對象可以賦值給基類對象;
- 派生類對象可以用來初始化基類引用羹奉;
- 派生類對象的地址可以賦值給基類指針秒旋,即派生類的指針可以賦值給基類的指針。
派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
派生類對象 創(chuàng)建 時(shí)诀拭,總是先執(zhí)行基類的構(gòu)造函數(shù)迁筛,再執(zhí)行派生類的構(gòu)造函數(shù)。
派生類對象 消亡 時(shí)耕挨,總是先執(zhí)行派生類的析構(gòu)函數(shù)细卧,再執(zhí)行基類的析構(gòu)函數(shù)。
定義派生類構(gòu)造函數(shù)的一般格式如下:
派生類名::派生類名(參數(shù)表): 基類名1(基類1的參數(shù)表), 基類名2(基類2的參數(shù)表)
{
派生類構(gòu)造函數(shù)體
};
派生類構(gòu)造函數(shù)的執(zhí)行次序:
- 調(diào)用基類構(gòu)造函數(shù)筒占,調(diào)用順序按照:它們 被繼承時(shí)聲明的順序 贪庙;
- 對派生類新增的成員變量 初始化,調(diào)用順序按照:它們在 類中聲明的順序 翰苫;
- 執(zhí)行派生類的構(gòu)造函數(shù)體中的內(nèi)容止邮。
類之間的關(guān)系
使用已有類編寫新的類有兩種方式:繼承 和 組合 。
繼承 關(guān)系也稱 “is a” 關(guān)系或 “是” 關(guān)系奏窑。具有 傳遞性 导披。
組合 關(guān)系也稱 “has a” 關(guān)系或 “有” 關(guān)系。表現(xiàn)為 封閉類良哲。
多層次的派生
在 C++ 中盛卡,派生是可以多層次的助隧。
根據(jù)是否直接繼承關(guān)系筑凫,可以分為:直接基類 和 間接基類 。
一個(gè)基類可以被多次說明為某個(gè)派生類的間接基類并村,但只能成為一次直接基類巍实。
當(dāng)生成派生類的對象時(shí),會從最頂層的基類開始逐層往下執(zhí)行所有基類的構(gòu)造函數(shù)哩牍,最后執(zhí)行派生類自身的構(gòu)造函數(shù)棚潦。
當(dāng)派生類的對象消亡時(shí),會執(zhí)行自身的析構(gòu)函數(shù)膝昆,然后自底向上執(zhí)行各個(gè)基類的析構(gòu)函數(shù)丸边。
基類與派生類指針的互相轉(zhuǎn)換
在 公有 派生的情況下叠必,因?yàn)榕缮悓ο笠彩腔悓ο螅?strong>所以派生類對象可以賦值給基類對象 。
對于指針類型妹窖,可以使用基類指針指向派生類對象纬朝,也可以將派生類的指針直接賦值給基類指針。
注意:即使基類指針指向一個(gè)派生類對象骄呼,不能通過基類指針訪問派生類的成員函數(shù)共苛。