版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第一文搞懂C++中繼承的概念與使用目錄前言繼承概念及定義繼承概念繼承定義繼承方式父類和子類對象賦值轉(zhuǎn)換繼承中的作用域派生類的默認(rèn)成員函數(shù)派生類的友元與靜態(tài)成員繼承關(guān)系單繼承多繼承菱形繼承
前言
我們都知道面向?qū)ο笳Z言的三大特點是:**封裝,繼承,多態(tài)。**之前在類和對象部分,我們提到了C++中的封裝,那么今天呢,我們來學(xué)習(xí)一下C++中的繼承。
繼承概念及定義
繼承概念
繼承(inheritance)機制是面向?qū)ο蟪绦蛟O(shè)計使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進行擴展,增加功能,這樣產(chǎn)生新的類,稱派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計的層次結(jié)構(gòu),體現(xiàn)了由簡單到復(fù)雜的認(rèn)知過程。以前我們接觸的復(fù)用都是函數(shù)復(fù)用,繼承是類設(shè)計層次的復(fù)用
看概念是一件很讓人疑惑的東西,接下來我就來舉個例子來看看繼承具體是什么東西
首先我們定義兩個類,一個Student類,一個Teacher類,二者都有年齡和姓名,學(xué)生有學(xué)號,老師有工號。
classStudent
private:
int_age;//年齡
string_name;//姓名
int_stuid;//學(xué)號
classTeacher
private:
int_age;//年齡
string_name;//姓名
int_jobid;//工號
我們發(fā)現(xiàn)這兩個類有一些重復(fù)的地方,比如年齡和姓名,這二者是他們的成員,此時代碼就產(chǎn)生了冗余。那么我們可不可以像個方法去復(fù)用這兩個成員呢?繼承此時就可以發(fā)揮它的重大作用。
我們將他們重復(fù)的地方提取出來,重新定義一個Person類。而Student類和Teacher類將Person類繼承下來,此時我們就實現(xiàn)了代碼的復(fù)用。
classPerson
protected:
int_age;//年齡
string_name;//姓名
classStudent:publicPerson
private:
int_stuid;//學(xué)號
classTeacher:publicPerson
private:
int_jobid;//工號
我們首先分別用Student和Teacher類來創(chuàng)建兩個對象,來看看對象里面有什么。
intmain()
Teachert;
Students;
return0;
}
此時我們可以看到我們創(chuàng)建的兩個對象里面都含有從Person類中繼承過來的age和name兩個成員。
所以繼承實際上是一個代碼的復(fù)用,我們可以借用已完成的類的代碼來完善我們需要創(chuàng)造的新類。
繼承定義
以我們剛剛創(chuàng)建的Student類來舉例:我們看到Person是父類,也稱作基類。Student是子類,也稱作派生類。
繼承方式
我們在類和對象的時候介紹了三種訪問限定符:public(公有),protected(保護)和private(私有)。訪問限定符限定了我們在類外如何去訪問類中的成員。
在繼承中我們一樣使用這三種限定符來限定子類該如何去訪問父類的的成員,下面有一張表來表示他們的關(guān)系。
類成員\繼承方式public繼承protected繼承private繼承父類的public成員派生類的public成員派生類的protected成員派生類的private成員父類的protected成員派生類的protected成員派生類的protected成員派生類的private成員父類的private成員在派生類中不可見在派生類中不可見在派生類中不可見
首先解釋一下在派生類中不可見是什么意思,就如同我們在類外無法直接去修改類中的private成員一樣,我們在子類中也無法直接修改父類的private成員。
如何簡潔的去記這個表呢?在C++中權(quán)限的關(guān)系:publicprotectedprivate。在繼承的時候呢,父類成員的權(quán)限取的是:父類成員原本權(quán)限和繼承方式中較小的那個。
比如父類的A成員原本權(quán)限為public,而子類的繼承方式為private。此時A成員相對子類來說就為private成員
父類和子類對象賦值轉(zhuǎn)換
子類的對象可以賦值給父類的對象/父類的指針/父類的應(yīng)用,那么是如何進行賦值的呢?形象一點來說就是切片,將子類中父類的部分切割父類。
但我們無法反過來,將父類對象賦值給子類對象。
繼承中的作用域
在繼承體系中父類和子類都有獨立的作用域,如果子類和父類中有同名的成員,子類成員將屏蔽對父類成員的直接訪問,這種情況叫隱藏,也叫重定義。
下面還是用我們的Person類和Student類來舉個栗子,我們分別在Person類和Student類中加入一個print函數(shù),通過打印內(nèi)容來區(qū)分調(diào)用的為哪一print函數(shù)。
classPerson
protected:
int_age;
string_name;
public:
voidprint()
cout"Person"endl;
classStudent:publicPerson
private:
int_stuid;//學(xué)號
public:
voidprint()
cout"Student"endl;
接下來我們創(chuàng)建一個對象然后來試一下結(jié)果。
intmain()
Students;
s.print();
return0;
}
我們可以看到我們調(diào)用的為Student中的print函數(shù)。此時子類的print函數(shù)已經(jīng)對父類的print函數(shù)進行了重定義。重定義不代表子類無法去調(diào)用父類的同名函數(shù),只是不那么直接而已。使用下面這種方法我們就可以調(diào)用父類中的同名函數(shù)。
intmain()
Students;
s.Person::print();
return0;
}
通過指定類域,我們就可以去調(diào)用父類的print函數(shù)。但在實際中最好不要去定義同名函數(shù)以免帶來問題。
派生類的默認(rèn)成員函數(shù)
首先我們來回顧一下有哪幾個默認(rèn)成員函數(shù)。
那么在子類中,這些默認(rèn)成員函數(shù)是怎么生成的呢?
1.子類的構(gòu)造函數(shù)必須調(diào)用父類的構(gòu)造函數(shù)初始化父類的那一部分成員。如果父類沒有默認(rèn)的構(gòu)造函數(shù),則必須在派生類構(gòu)造函數(shù)的初始化列表中顯式調(diào)用。還是用我們的Person類和Student類舉例。
情況一:有默認(rèn)構(gòu)造函數(shù)
classPerson
protected:
int_age;
string_name;
public:
Person()
cout"Person"endl;//調(diào)用就打印
classStudent:publicPerson
private:
int_stuid;//學(xué)號
public:
Student()
cout"Student"endl;//調(diào)用就打印
intmain()
Students;
return0;
情況二:無默認(rèn)構(gòu)造函數(shù)
classPerson
protected:
int_age;
string_name;
public:
Person(intage,stringname)
cout"Person"endl;
classStudent:publicPerson
private:
int_stuid;//學(xué)號
public:
Student()
:Person(19,"wanku")//無默認(rèn)構(gòu)造,此時我們需要在初始化列表中初始化
cout"Student"endl;
intmain()
Students;
return0;
intmain()
Students;
return0;
2.子類的拷貝構(gòu)造函數(shù)必須調(diào)用父類的拷貝構(gòu)造完成父類的拷貝初始化化。
classPerson
protected:
int_age;
string_name;
public:
Person(intage=10,stringname="wanku")
cout"Person"endl;
Person(constPersonp)
:_age(p._age),_name(p._name)
classStudent:publicPerson
private:
int_stuid;//學(xué)號
public:
Student()
cout"Student"endl;
Student(constStudents)
:Person(s)/*顯示調(diào)用父類的拷貝構(gòu)造*/,_stuid(s._stuid)
};
有些朋友可能會疑惑,在Person類中的拷貝構(gòu)造函數(shù)參數(shù)明明是Person類,為什么我們的Student類可以傳過去呢?那是因為我們剛剛講的切片原理,當(dāng)我們把子類對象傳過去時,編譯器會進行切分,然后再傳給父類。
3.派生類的operator=必須要調(diào)用基類的operator=完成基類的復(fù)制。(原理和拷貝構(gòu)造大體相似,值得注意的是:當(dāng)我們在子類直接想去調(diào)用父類的operator=時,會發(fā)生重定義,使用時記得加上父類的作用域)
4.在繼承中一個對象的歷程如下:父類的構(gòu)造函數(shù)子類的構(gòu)造函數(shù)子類的析構(gòu)函數(shù)父類的析構(gòu)函數(shù)。這個過程相當(dāng)于把這些行為存在一個棧中,然后再把行為從棧中拿出來一般
派生類的友元與靜態(tài)成員
父類的友元不是子類的友元。(你爸爸的朋友不一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025國家應(yīng)急救援科委會綜合能源加注站招聘加油員管理人員2人備考題庫及完整答案詳解
- 2026華能(福建漳州)熱電有限責(zé)任公司校園招聘備考題庫及答案詳解(奪冠系列)
- 2025新疆農(nóng)發(fā)集團肥業(yè)有限公司招聘3人備考題庫及完整答案詳解
- 2025年圖們市安置委培生招聘員額制工作人員備考題庫(18人)及答案詳解(新)
- 2026安徽滁州市公共數(shù)據(jù)授權(quán)運營合伙人(第一批)招募備考題庫含答案詳解
- 2025福建寧德市統(tǒng)計局普查中心公開招聘工作人員3人備考題庫有完整答案詳解
- 2026年烏魯木齊市第七十中學(xué)會展校區(qū)(152中)高中部教師補招備考題庫及參考答案詳解
- 2025四川雅安市滎經(jīng)縣縣屬國有企業(yè)招聘14人備考題庫及1套參考答案詳解
- 2025廣西壯族自治區(qū)胸科醫(yī)院第二批高層次人才招聘實名編制人員3人備考題庫及答案詳解(考點梳理)
- 2026廣東省華南農(nóng)業(yè)大學(xué)招聘專業(yè)技術(shù)人員60人備考題庫完整答案詳解
- 急診預(yù)檢分診課件教學(xué)
- 2025年高二數(shù)學(xué)建模試題及答案
- 2026屆浙江省杭州城區(qū)6學(xué)校數(shù)學(xué)七年級第一學(xué)期期末教學(xué)質(zhì)量檢測試題含解析
- 儲能集裝箱知識培訓(xùn)總結(jié)課件
- 幼兒園中班語言《雪房子》課件
- 房地產(chǎn)項目開發(fā)管理方案
- 堆垛車安全培訓(xùn)課件
- 貝林妥單抗護理要點
- 衛(wèi)生院關(guān)于成立消除艾滋病、梅毒、乙肝母嬰傳播領(lǐng)導(dǎo)小組及職責(zé)分工的通知
- 廣東省執(zhí)信中學(xué)、廣州二中、廣州六中、廣雅中學(xué)四校2025年高三物理第一學(xué)期期末學(xué)業(yè)水平測試試題
- 小學(xué)語文教學(xué)能力提升策略
評論
0/150
提交評論