日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搞清虚析构函数的使用场合

發(fā)布時間:2024/9/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搞清虚析构函数的使用场合 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

疑問:什么情況下必須用虛析構(gòu)?


先看個例子:


#include?<iostream>?? class?A?? {?? public:??A(){};??~A()??{??std::cout?<<?"~A"?<<?std::endl;??};?? private:??int?a;?? };??class?B?:?public?A?? {?? public:??B(){};??~B()??{??std::cout?<<?"~B"?<<?std::endl;??}?? private:??int?b;?? };??int?main()??? {???????B?b;???????return?0;?? }

? ??

調(diào)試發(fā)現(xiàn),窗口依次輸出: ~B 和 ~A,也就是說,B類對象b析構(gòu)的時候,先調(diào)用了B類的析構(gòu)函數(shù),然后調(diào)用了基類的析構(gòu)函數(shù)。


如果 main 函數(shù)中的代碼,替換為如下呢?


int?main()? {?B?*pb?=?new?B();?delete?pb;?return?0;? }

? ??

你會發(fā)現(xiàn),還是依次輸出了 ~B 和 ~A,也就是說,當使用子類指針指向子類對象的時候,析構(gòu)的時候,依然會依次調(diào)用子類和基類的析構(gòu)函數(shù)。


如果 main 函數(shù)中的代碼,替換為如下呢?


int?main()? {?A?*?pa?=?new?B();?delete?pa;?return?0;? }


調(diào)試發(fā)現(xiàn),這份代碼,只會輸出 ~A, 哦,到此終于明白了,當用基類指針指向派生類對象時,如果基類析構(gòu)函數(shù)不設(shè)置為 virtual 的話,則在 delete 基類指針的時候,無法成功調(diào)用子類的析構(gòu)函數(shù)。這才是虛析構(gòu)函數(shù)發(fā)揮作用的真正場合。

? ??

上述代碼解決方法: 把基類 A 的析構(gòu)函數(shù)設(shè)置為 virtual,則可以成功實現(xiàn)delete pa 的時候依次調(diào)用B類和A類的析構(gòu)函數(shù)了。

? ??

那么,進一步講,我們是否應(yīng)該把所有類的析構(gòu)函數(shù)都設(shè)置為虛析構(gòu)呢?

? ??

不應(yīng)該,這樣設(shè)置不合理,只有在該類可能作為基類的情況下,并且可能使用到多態(tài)特性的時候,才有必要把基類的析構(gòu)函數(shù)設(shè)置為虛析構(gòu),否則,沒有必要,因為設(shè)置為虛析構(gòu)會產(chǎn)生額外的開銷,即下一個問題:

? ??

一個類如果把析構(gòu)函數(shù)設(shè)置為 virtual 是否也會產(chǎn)生虛函數(shù)表?

? ??

我們把上述代碼稍微改一下:?


class?A?? {?? public:??A(){};??~A()??{??std::cout?<<?"~A"?<<?std::endl;??};??void?test()?{?std::cout?<<?"~test"?<<?std::endl;?}? private:??int?a;?? };??int?main()?? {??std::cout?<<?sizeof(A)?<<?std::endl;?? }


如果 ~A 前面不加 virtual 則輸出的結(jié)果是: 4

如果 ~A 前面加 virtual 則輸出的結(jié)果是: 8?


可以得出如下結(jié)論:


(1) 如果類沒有virtual成員函數(shù)時,類的大小由數(shù)據(jù)成員大小決定

(2) 虛析構(gòu)函數(shù)也會使類產(chǎn)生虛函數(shù)表,并且虛函數(shù)表的大小是 4 字節(jié)


本文轉(zhuǎn)自 Jhuster 51CTO博客,原文鏈接:http://blog.51cto.com/ticktick/961418,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的搞清虚析构函数的使用场合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。