搞清虚析构函数的使用场合
疑問:什么情況下必須用虛析構(gòu)?
先看個例子:
? ??
調(diào)試發(fā)現(xiàn),窗口依次輸出: ~B 和 ~A,也就是說,B類對象b析構(gòu)的時候,先調(diào)用了B類的析構(gòu)函數(shù),然后調(diào)用了基類的析構(gòu)函數(shù)。
如果 main 函數(shù)中的代碼,替換為如下呢?
? ??
你會發(fā)現(xiàn),還是依次輸出了 ~B 和 ~A,也就是說,當使用子類指針指向子類對象的時候,析構(gòu)的時候,依然會依次調(diào)用子類和基類的析構(gòu)函數(shù)。
如果 main 函數(shù)中的代碼,替換為如下呢?
調(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ù)表?
? ??
我們把上述代碼稍微改一下:?
如果 ~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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论:CMMI项目策划方法(PP)
- 下一篇: linux 安装反病毒软件