-
判斷對(duì)象類型
查看全部 -
抽象類無法實(shí)例化對(duì)象
查看全部 -
虛函數(shù)調(diào)用過程
查看全部 -
子類中同名函數(shù)也要加關(guān)鍵字
查看全部 -
在父類中把想要實(shí)現(xiàn)多態(tài)的成員函數(shù),定義為虛函數(shù)
查看全部 -
動(dòng)態(tài)多態(tài)用到的虛函數(shù)
查看全部 -
什么是多態(tài)
查看全部 -
【異常處理的關(guān)鍵字】try…catch…? ? ? throw
try和catch可以是一對(duì)多的
常見的異常:數(shù)組下標(biāo)越界、除數(shù)為0、內(nèi)存不足
查看全部 -
【RTTI(Run-Time-Type-Identification)】運(yùn)行時(shí)類型識(shí)別
void?dosomething(Flyable?*obj){ ????obj->takeoff(); ????obj->land(); ????//使用RTTI ????cout?<<?typeid(*obj).name()?<<?endl;?//打印出指針obj實(shí)際指向的類型 ????if(typeid(*obj)==typeid(Bird)){???//如果當(dāng)前obj指向一個(gè)Bird類型 ????????Bird?*bird=dynamic_cast<Bird?*>(obj);?//將obj轉(zhuǎn)化為一個(gè)Bird*類型 ????????bird->foraging();??//調(diào)用Bird類中的函數(shù)foraging(); ????} }
【dynamic_cast使用的注意事項(xiàng)】:
1、只能應(yīng)用于指針的轉(zhuǎn)換或引用的轉(zhuǎn)換,而不是某個(gè)類型本身(<Bird *>要加上星號(hào))
2、要轉(zhuǎn)換的類型中必須包含虛函數(shù)
3、轉(zhuǎn)換成功,則返回子類的地址;失敗則返回NULL
【typeid使用的注意事項(xiàng)】:
1、返回一個(gè)type_info對(duì)象的引用
2、如果想通過基類的指針獲得派生類的數(shù)據(jù)類型,則基類必須有虛函數(shù)
3、只能獲取對(duì)象的實(shí)際類型
查看全部 -
【接口類】?jī)H含有純虛函數(shù)的類(沒有任何數(shù)據(jù)成員,僅有成員函數(shù)且都是純虛函數(shù)),在實(shí)際應(yīng)用中更多地用來表達(dá)一種能力/協(xié)議
class?Flyable{ public: ????virtual?void?takeoff()=0;//起飛 ????virtual?void?land()=0;//降落 };
查看全部 -
class?Shape{ public: ????virtual?double?calcArea(){return?0};//虛函數(shù) ????virtual?double?calcPerimeter()=0;//純虛函數(shù)(在后面加“=0”) }
【抽象類】含有純虛函數(shù)的類,無法實(shí)例化對(duì)象,其子類也可以是抽象類,也可以不是(只有當(dāng)子類不是抽象類,即對(duì)所有函數(shù)都實(shí)現(xiàn)了,才可以用這個(gè)子類實(shí)例化對(duì)象)
查看全部 -
父類數(shù)據(jù)成員中會(huì)有一個(gè)【虛函數(shù)表指針】,指向一個(gè)虛函數(shù)表,在表中相應(yīng)虛函數(shù)(比如計(jì)算面積)的入口地址,從而找到當(dāng)前定義的虛函數(shù)
當(dāng)實(shí)例化一個(gè)子類的時(shí)候,由于當(dāng)中沒有定義虛函數(shù),但是從父類中繼承了,所以在實(shí)例化時(shí)會(huì)產(chǎn)生一個(gè)虛函數(shù)表(跟父類中的不是同一個(gè)),但是相應(yīng)函數(shù)(比如計(jì)算面積)的函數(shù)指針是一樣的(同樣的入口地址)
但是如果子類中的相應(yīng)函數(shù)是一個(gè)虛函數(shù),則相應(yīng)的函數(shù)指針就會(huì)覆蓋父類的函數(shù)指針(不再是相同的入口地址)
【虛析構(gòu)函數(shù)可以防止內(nèi)存泄露的理論前提】執(zhí)行完子類的析構(gòu)函數(shù)就會(huì)執(zhí)行父類的析構(gòu)函數(shù)
查看全部 -
【動(dòng)態(tài)多態(tài)的內(nèi)存泄露問題】
使用delete銷毀父類指針,只會(huì)執(zhí)行父類的析構(gòu)函數(shù)
銷毀子類指針,會(huì)執(zhí)行父類和子類的析構(gòu)函數(shù)
但在多態(tài)中,是用一個(gè)父類的指針指向一個(gè)子類的內(nèi)存,因此無法執(zhí)行子類的析構(gòu)函數(shù)
Shape?*s1=new?Circle(3,4,5.0);
使用【虛析構(gòu)函數(shù)】來解決
virtual?~Shape();
【virtual在修飾函數(shù)時(shí)的限制】
1、不能修飾普通函數(shù),必須是【某個(gè)類】的成員函數(shù),不能是全局函數(shù)
2、不能修飾靜態(tài)成員函數(shù)
virtual?static?int?getCount();?//錯(cuò)誤
3、不能修飾內(nèi)聯(lián)函數(shù)
inline?virtual?int?eat();//計(jì)算機(jī)就會(huì)忽略掉inline關(guān)鍵字
4、不能修飾構(gòu)造函數(shù)
查看全部 -
相同對(duì)象收到不同消息,或不同對(duì)象收到相同消息時(shí)產(chǎn)生的不同動(dòng)作
1、早綁定/靜態(tài)多態(tài)
public: ????int?Area(int?width); ????int?Area(int?width,int?height);?//互為重載
程序在編譯階段就已經(jīng)確定到底要使用哪個(gè)函數(shù)了(傳入?yún)?shù)的個(gè)數(shù)不同)
2、晚綁定/動(dòng)態(tài)多態(tài):必須以封裝和繼承為基礎(chǔ)
用virtual關(guān)鍵詞修飾成員函數(shù)(修飾想要實(shí)現(xiàn)多態(tài)的成員函數(shù)),使之成為虛函數(shù)
查看全部 -
面向?qū)ο蟮娜筇卣鳎悍庋b、多態(tài)、繼承
查看全部
舉報(bào)