純虛函數(shù):形式為virtual void fun1() = 0;
純虛函數(shù)不需要實(shí)現(xiàn)浮定,原因是不會(huì)被調(diào)用到
C++中基類(lèi)采用virtual虛析構(gòu)函數(shù)是為了防止內(nèi)存泄漏
只有當(dāng)一個(gè)類(lèi)被用來(lái)作為基類(lèi)的時(shí)候淫僻,才會(huì)把析構(gòu)函數(shù)寫(xiě)成虛函數(shù)。
具體地說(shuō)壶唤,如果派生類(lèi)中申請(qǐng)了內(nèi)存空間,并在其析構(gòu)函數(shù)中對(duì)這些內(nèi)存空間進(jìn)行釋放棕所。假設(shè)基類(lèi)中采用的是非虛析構(gòu)函數(shù)闸盔,當(dāng)刪除基類(lèi)指針指向的派生類(lèi)對(duì)象時(shí)就不會(huì)觸發(fā)動(dòng)態(tài)綁定,因而只會(huì)調(diào)用基類(lèi)的析構(gòu)函數(shù)琳省,而不會(huì)調(diào)用派生類(lèi)的析構(gòu)函數(shù)迎吵。
那么在這種情況下,派生類(lèi)中申請(qǐng)的空間就得不到釋放從而產(chǎn)生內(nèi)存泄漏针贬。所以击费,為了防止這種情況的發(fā)生,C++中基類(lèi)的析構(gòu)函數(shù)應(yīng)采用virtual虛析構(gòu)函數(shù)桦他。
C++多態(tài)性
主要是通過(guò)虛函數(shù)實(shí)現(xiàn)的蔫巩,虛函數(shù)允許子類(lèi)重寫(xiě)override
(注意和overload的區(qū)別,overload是重載快压,是允許同名函數(shù)的表現(xiàn)圆仔,這些函數(shù)參數(shù)列表/類(lèi)型不同)
多態(tài)與非多態(tài)的實(shí)質(zhì)區(qū)別就是函數(shù)地址是早綁定還是晚綁定。
如果函數(shù)的調(diào)用蔫劣,在編譯器編譯期間就可以確定函數(shù)的調(diào)用地址坪郭,并生產(chǎn)代碼,是靜態(tài)的脉幢,就是說(shuō)地址是早綁定的歪沃。
而如果函數(shù)調(diào)用的地址不能在編譯器期間確定,需要在運(yùn)行時(shí)才確定嫌松,這就屬于晚綁定沪曙。
目的:接口重用。封裝可以使得代碼模塊化豆瘫,繼承可以擴(kuò)展已存在的代碼珊蟀,他們的目的都是為了代碼重用。而多態(tài)的目的則是為了接口重用。
用法:聲明基類(lèi)的指針育灸,利用該指針指向任意一個(gè)子類(lèi)對(duì)象腻窒,調(diào)用相應(yīng)的虛函數(shù),可以根據(jù)指向的子類(lèi)的不同而實(shí)現(xiàn)不同的方法磅崭。