面試時(shí)被問到了虛析構(gòu)函數(shù)的使用,特此記錄
?
首先我們寫兩個(gè)類:
#ifndef CLX_H #define CLX_H #include <iostream> class ClxBase { public: ClxBase() {std::cout << "clx_base has been created" << std::endl;} virtual ~ClxBase() {std::cout << "clx_base has been destroyed" << std::endl;} virtual void dosomething() {std::cout << "clx_base dosomething..." << std::endl;} }; class ClxDerived : public ClxBase { public: ClxDerived() {std::cout << "clx_derived has been created" << std::endl;} ~ClxDerived(){std::cout << "clx_derived has been destroyed" << std::endl;} void dosomething() {std::cout << "clx_derived dosomething..." << std::endl;} }; #endif
?
指明了,父類的析構(gòu)函數(shù)是虛類型。
?
調(diào)用代碼:
ClxBase *clx = new ClxDerived; clx->dosomething(); delete clx;
?
運(yùn)行結(jié)果如下:
注意類加載時(shí)的順序和析構(gòu)的順序是剛好相反的。析構(gòu)是總是從子類開始,然后再回收父類,符合編程要求。
?
如果將父類中規(guī)定的虛類型去掉,即
class ClxBase { public: ClxBase() {std::cout << "clx_base has been created" << std::endl;} ~ClxBase() {std::cout << "clx_base has been destroyed" << std::endl;} virtual void dosomething() {std::cout << "clx_base dosomething..." << std::endl;} };
這樣,只會(huì)執(zhí)行基類的析構(gòu)函數(shù),而派生類的析構(gòu)函數(shù)不會(huì)執(zhí)行。 相當(dāng)于沒有重載。
運(yùn)行效果如下:
當(dāng)基類的析構(gòu)函數(shù)為虛函數(shù)時(shí),無論指針指的是同一類族中的哪一個(gè)類對(duì)象,系統(tǒng)會(huì)采用動(dòng)態(tài)關(guān)聯(lián),調(diào)用相應(yīng)的析構(gòu)函數(shù),對(duì)該對(duì)象進(jìn)行清理工作。
如果將基類的析構(gòu)函數(shù)聲明為虛函數(shù)時(shí),由該基類所派生的所有派生類的析構(gòu)函數(shù)也都自動(dòng)成為虛函數(shù),即使派生類的析構(gòu)函數(shù)與基類的析構(gòu)函數(shù)名字不相同。
最好把基類的析構(gòu)函數(shù)聲明為虛函數(shù)。這將使所有派生類的析構(gòu)函數(shù)自動(dòng)成為虛函數(shù)。這樣,如果程序中顯式地用了delete運(yùn)算符準(zhǔn)備刪除一個(gè)對(duì)象,而delete運(yùn)算符的操作對(duì)象用了指向派生類對(duì)象的基類指針,則系統(tǒng)會(huì)調(diào)用相應(yīng)類的析構(gòu)函數(shù)。
虛析構(gòu)函數(shù)的概念和用法很簡單,但它在面向?qū)ο蟪绦蛟O(shè)計(jì)中卻是很重要的技巧。
專業(yè)人員一般都習(xí)慣聲明虛析構(gòu)函數(shù),即使基類并不需要析構(gòu)函數(shù),也顯式地定義一個(gè)函數(shù)體為空的虛析構(gòu)函數(shù),以保證在撤銷動(dòng)態(tài)分配空間時(shí)能得到正確的處理。
構(gòu)造函數(shù)不能聲明為虛函數(shù)。這是因?yàn)樵趫?zhí)行構(gòu)造函數(shù)時(shí)類對(duì)象還未完成建立過程,當(dāng)然談不上函數(shù)與類對(duì)象的綁定。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
