c++学习笔记之继承和多态
生活随笔
收集整理的這篇文章主要介紹了
c++学习笔记之继承和多态
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、public 繼承
class A : public B (1)友元函數(shù)不能被繼承 (2)protected成員可以被派生類和友元訪問2、派生類
(1)派生類構(gòu)造函數(shù)如果未顯式調(diào)用基類構(gòu)造函數(shù),則會隱式調(diào)用基類默認(rèn)構(gòu)造函數(shù),沒有則報錯。 (2)派生類頭文件中#include包含基類頭文件 (3)派生類調(diào)用基類函數(shù)(已在派生類中重新定義過) 基類名::基類函數(shù) ? ? ? ? ?如 B::b(...) 重新定義函數(shù)時一般會調(diào)用其基類函數(shù),如果不加“基類名::”則會調(diào)用自己,形成無限遞歸。 (4)派生類有一個與基類中同名但簽名不同的成員函數(shù),那么會隱藏基類的那個成員函數(shù)。如: 基類A有一個成員函數(shù) ?void go(int i) 派生類B有 ? ? ? ? ? ? ? ? ?void go(int i, int j) b.go(1)會編譯報錯參數(shù)太少。(如果派生類沒有g(shù)o函數(shù),則會直接調(diào)用基類的) (5)多層派生關(guān)系:構(gòu)造函數(shù)會從基類->派生類的順序調(diào)用,析構(gòu)函數(shù)則相反。 (6)派生類不會繼承基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和重載的運算符。3、public/private/protected 繼承
繼承public基類:基類的public成員成為派生類public成員,protected成員成為派生類的protected成員,派生類不能直接訪問基類private成員。 繼承protected基類:基類的public、protected成員成為派生類的protected成員,派生類不能直接訪問基類private成員。 繼承private基類:基類的public、protected成員成為派生類的private成員,派生類不能直接訪問基類private成員。4、基類、派生類指針
(1)基類指針指向派生類對象,可以調(diào)用基類成員,調(diào)用派生類成員則報錯,但可以將基類指針顯式強(qiáng)轉(zhuǎn)成派生類指針就可以調(diào)用了。所以句柄類型決定哪個類函數(shù)被調(diào)用。 (2)派生類指針指向基類對象,編譯錯誤。5、virtual
virtual void a(...) 當(dāng)通過指針調(diào)用virtual函數(shù),則不再根據(jù)句柄來決定,而是根據(jù)指針?biāo)傅膶ο蟮念愋?/span>選擇合適的函數(shù)調(diào)用。 (1)一個函數(shù)聲明為virtual,那么從整個繼承層次的那一點向下所有類中都保持virtual,即使派生類重載此函數(shù)時并沒有顯式的聲明virtual。 所以重載最好也顯式聲明virtual。 (2)當(dāng)virtual函數(shù)通過按名引用被調(diào)用,如a.b(),調(diào)用哪個函數(shù)在編譯時已經(jīng)決定,即靜態(tài)綁定,并不是多態(tài)性行為。 因此動態(tài)綁定只能通過指針句柄來完成。6、抽象類
通過聲明類的一個或多個virtual函數(shù)為純virtual函數(shù),可以使一個類成為抽象類。 純virtual函數(shù) ?virtual void a(...) const = 0; “=0”稱為純指示符。 派生類必須重載純virtual函數(shù),否則實例化時編譯報錯。7、運行時類型信息RTTI(dynamic_cast\typeid\type_info)
dynamic_cast<class>(...) ?向下強(qiáng)制類型轉(zhuǎn)換 typeid(...)返回一個type_info對象的引用,其成員函數(shù)name()返回typeid實參的類型名稱字符串(如“Class A”)。注意這個字符串與編譯器有關(guān),不同編譯器可能不同。8、virtual析構(gòu)函數(shù)
刪除一個派生類對象卻使用基類指針,這樣就無法調(diào)用派生類析構(gòu)函數(shù),會報行為未定義錯誤。 解決方法是聲明基類析構(gòu)函數(shù)為virtual,即使派生類析構(gòu)函數(shù)與基類的不同名,也可以使這些析構(gòu)函數(shù)為virtual函數(shù),這時刪除就能正常銷毀。 (1)如果一個類會有virtual函數(shù),就要提供一個virtual析構(gòu)函數(shù) (2)構(gòu)造函數(shù)不能聲明為virtual?
總結(jié)
以上是生活随笔為你收集整理的c++学习笔记之继承和多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++学习笔记之运算符重载
- 下一篇: ScrollView内嵌ListView