
虛析構(gòu)和純虛析構(gòu)函數(shù)的關(guān)系,虛析構(gòu)和純虛析構(gòu)函數(shù)

純虛析構(gòu)函數(shù)的介紹 ·純虛函數(shù)是一個模糊的類內(nèi)部的約定,它需要用子類來實(shí)現(xiàn)。虛析構(gòu)函數(shù):在子類中建了一些對象一般是不能被父類預(yù)知的,所以常常要在子類中建立新的析構(gòu)函數(shù)覆...
純虛析構(gòu)函數(shù)的介紹
·純虛函數(shù)是一個模糊的類內(nèi)部的約定,它需要用子類來實(shí)現(xiàn)。虛析構(gòu)函數(shù):在子類中建了一些對象一般是不能被父類預(yù)知的,所以常常要在子類中建立新的析構(gòu)函數(shù)覆蓋父類的析構(gòu)函數(shù)。
析構(gòu)函數(shù)是“反向”的構(gòu)造函數(shù)。它們在對象被撤消(回收)時調(diào)用。析構(gòu)函數(shù)的名 稱除了最前面的“~”符號外,與類的名稱相同。例如,類String的析構(gòu)函數(shù)是~string()。
awov:~awov() {} // 純虛析構(gòu)函數(shù)的定義 這個定義是必需的,因?yàn)樘撐鰳?gòu)函數(shù)工作的方式是:最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個基類的析構(gòu)函數(shù)被調(diào)用。
析構(gòu)函數(shù)往往用來做“清理善后” 的工作(例如在建立對象時用new開辟了一片內(nèi)存空間,delete會自動調(diào)用析構(gòu)函數(shù)后釋放內(nèi)存)。
比如你有個游戲,游戲里有個虛基類叫「怪物」,有純虛函數(shù) 「攻擊」。派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實(shí)現(xiàn)了自己不同的「攻擊」函數(shù),比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。
...1.請說明類的純虛函數(shù)、虛函數(shù)、靜態(tài)成員函數(shù)、普通成員函數(shù)的區(qū)別...
虛函數(shù)和純虛函數(shù)的區(qū)別:聲明方式不同、實(shí)現(xiàn)方式不同、覆蓋方式不同、特性不同、用法不同。
作用不同。虛函數(shù)的作用是“運(yùn)行時多態(tài)”和重載,父類中提供虛函數(shù)的實(shí)現(xiàn),為子類提供默認(rèn)的函數(shù)實(shí)現(xiàn);子類可以重寫父類的虛函數(shù)實(shí)現(xiàn)子類的特殊化。純虛函數(shù)是抽象類,包含純虛函數(shù)的類稱為抽象類,它只提供申明,不實(shí)現(xiàn)。
虛函數(shù)的作用是“運(yùn)行時多態(tài)”和重載,父類中提供虛函數(shù)的實(shí)現(xiàn),為子類提供默認(rèn)的函數(shù)實(shí)現(xiàn);子類可以重寫父類的虛函數(shù)實(shí)現(xiàn)子類的特殊化。
純虛函數(shù)和抽象類:含有純虛函數(shù)的類是抽象類,不能生成對象,只能派生。他派生的類的純虛函數(shù)沒有被改寫,那么,它的派生類還是個抽象類。
虛函數(shù)是指一個類中你希望重載的成員函數(shù),當(dāng)你用一個基類指針或引用指向一個繼承類對象的時候,你調(diào)用一個虛函數(shù),實(shí)際調(diào)用的是繼承類的版本。有純虛函數(shù)的類是抽象類,不能生成對象,只能派生。
虛析構(gòu)函數(shù)的介紹
1、析構(gòu)函數(shù)是“反向”的構(gòu)造函數(shù)。它們在對象被撤消(回收)時調(diào)用。析構(gòu)函數(shù)的名 稱除了最前面的“~”符號外,與類的名稱相同。例如,類String的析構(gòu)函數(shù)是~string()。
2、析構(gòu)函數(shù)可以為虛函數(shù),也可以不為虛函數(shù)。(更多的時候不為虛函數(shù))。設(shè)計(jì)析構(gòu)函數(shù)為虛函數(shù),主要是考慮到繼承。
3、簡單地說,那些被virtual關(guān)鍵字修飾的成員函數(shù),就是虛函數(shù)。實(shí)現(xiàn)多態(tài)性,多態(tài)性是將接口與實(shí)現(xiàn)進(jìn)行分離。
4、虛析構(gòu)函數(shù)和析構(gòu)函數(shù)在功能上是一回事,因此除了動態(tài)聯(lián)編(此處意思:需要銷毀 父類指針指向的子類對象的空間)外,其他性質(zhì)和析構(gòu)函數(shù)類似。
c++為何基類的析構(gòu)函數(shù)要么定義為保護(hù)的公有成員函數(shù),要么定義為虛函數(shù)...
作為一般規(guī)則,我們建議將類層次結(jié)構(gòu)的根基類(聲明了一個或多個虛擬函數(shù))的析構(gòu)函數(shù)聲明為虛擬的。但是,不像基類的構(gòu)造函數(shù),一般地,基類的析構(gòu)函數(shù)不應(yīng)該是protected。
virtual 函數(shù)定義后的=0是指純虛函數(shù)。析構(gòu)函數(shù)設(shè)置為公有是讓其可以析構(gòu),私有的析構(gòu)函數(shù)不能正常析構(gòu)調(diào)用。
如果是虛函數(shù),會調(diào)用派生類中的版本。如果是非虛函數(shù),會調(diào)用指針?biāo)割愋偷膶?shí)現(xiàn)版本。析構(gòu)函數(shù)也會遵循以上兩種情況,因?yàn)槲鰳?gòu)函數(shù)也是函數(shù)嘛,不要把它看得太特殊。
類析構(gòu)函數(shù)要聲明為虛函數(shù)這樣派生類調(diào)用析構(gòu)函數(shù)才能層層回調(diào),釋放資源。這也是虛函數(shù)的作用--提供回調(diào)的指針。
虛析構(gòu)函數(shù)的虛析構(gòu)函數(shù)舉例
1、很明顯,“delete pb;”只調(diào)用了 B 的析構(gòu)函數(shù),沒有調(diào)用 D 的析構(gòu)函數(shù),從而導(dǎo)致內(nèi)存的遺漏。這個問題涉及“虛析構(gòu)函數(shù)”,不知道你們學(xué)沒。
2、析構(gòu)函數(shù)是“反向”的構(gòu)造函數(shù)。它們在對象被撤消(回收)時調(diào)用。析構(gòu)函數(shù)的名 稱除了最前面的“~”符號外,與類的名稱相同。例如,類String的析構(gòu)函數(shù)是~string()。
3、純虛函數(shù):當(dāng)一個類被定義后,有一些函數(shù)往往還不能確定,這個時候?yàn)榱嗽L止亂寫一個制成錯誤,就要用純虛函數(shù)。沒有函數(shù)體的函數(shù)。
4、在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成對象明顯不合常理。
5、虛析構(gòu)函數(shù)是為了解決這樣的一個問題:基類的指針指向派生類對象,并用基類的指針刪除派生類對象。
6、簡單的說。意思就是說:如果你不聲明為virtual的話,而你又聲明為mml*類型指針,那么,delete 的時候,只能delete掉mml類型所擁有的對象部分,而你實(shí)際new 出來的對象就delete不掉了。這樣就會出現(xiàn)對象切割。
本文鏈接:http://www.wzyaohuidianqi.cn/ke/14613.html
上一篇:cnn最新報道,cnn昨天新聞
