青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chaosuper85

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

    C++虛函數(shù)探索筆記(3)——延伸思考:虛函數(shù)應(yīng)用的一些其他情形

    關(guān)注問題:

    虛函數(shù)的作用

    虛函數(shù)的實現(xiàn)原理

    虛函數(shù)表在對象布局里的位置

    虛函數(shù)的類的sizeof

    純虛函數(shù)的作用

    多級繼承時的虛函數(shù)表內(nèi)容

    虛函數(shù)如何執(zhí)行父類代碼

    多繼承時的虛函數(shù)表定位,以及對象布局

    虛析構(gòu)函數(shù)的作用

    虛函數(shù)在QT中的應(yīng)用

    虛函數(shù)與inline修飾符,static修飾符

    虛析構(gòu)函數(shù)

    大家都知道,在C++里需要自己嚴(yán)格管理好資源的分配和回收。通常情況下,

在一個對象被析構(gòu)的時候,是要由其釋放其申請到的各種資源的。最常見的,當(dāng)

然就是內(nèi)存資源啦。

    當(dāng)只有一個類的時候,我們可以不用考慮太多,只要在析構(gòu)函數(shù)里檢查并釋

放所有申請到的資源即可。但是在這個類繼承了一個抽象接口基類時,就有點點

不一樣了。讓我們看看類的析構(gòu)過程:

    在大多數(shù)的類的使用時,通常都是直接刪除該類的實例對象,然后該類的析

構(gòu)函數(shù)就會被調(diào)用,從而使得這個類在析構(gòu)函數(shù)里執(zhí)行的資源釋放代碼被執(zhí)行到

。

    如果這個類繼承了其他類,那么編譯器還會在這個類的析構(gòu)函數(shù)里自動添加

對父類的析構(gòu)函數(shù)的調(diào)用,從而將父類里申請的資源也進(jìn)行釋放。如果偶多個父

類,也會依次調(diào)用各個析構(gòu)函數(shù)。

    倘若繼承的是一個抽象接口類,并且在程序運行期,可能通過一個基類指針

將此對象釋放掉,那么致命而又隱藏的內(nèi)存泄露BUG就出現(xiàn)啦……因為試圖刪除的

是基對象,刪除時調(diào)用的是基類的析構(gòu)函數(shù),而基類的析構(gòu)函數(shù)當(dāng)然是不會去調(diào)

用子類的析構(gòu)函數(shù)的羅!

    讓我們看看下面的代碼,使用vs2008編譯并運行的時候,將會在程序運行結(jié)

束時報告內(nèi)存泄漏情況(如果要在linux下編譯測試,需要去掉第一行的include

,以及return前的_CrtDumpMemoryLeaks()函數(shù),然后使用linux下檢查內(nèi)存泄

露的工具進(jìn)行測試)。
 //Source filename: Win32Con.cpp
#include
class parent
{
public:
 parent() { }
 /*virtual */ ~parent() { }
};

class child:public parent
{
public:
 child()
 {
  p=new char[1000];
 }
 ~child()
 {
  delete[] p;
 }
 char *p;
};

void free_child(parent *pp)
{
 delete pp;
}

int main()
{
 child *obj=new child();
 free_child(obj);
 _CrtDumpMemoryLeaks();
 return 0;
}

 


    在這段代碼里我們創(chuàng)建的是一個child類型的對象,然后使用free_child

(parent*)函數(shù)來試圖釋放這個對象,這個時候,只會調(diào)用到parent::

~parent()這個析構(gòu)函數(shù),而不會調(diào)用到child::~child()!

    如何解決這個問題呢?

    很簡單的,只要在parent::~parent()前增加 virtual關(guān)鍵字,將其變成

一個虛函數(shù)。這樣,無論是以這個對象的父類指針進(jìn)行刪除的時候,就會從虛函

數(shù)表里定位到子類child的析構(gòu)函數(shù),這樣就能夠從子類開始一級一級的向上調(diào)用

析構(gòu)函數(shù),從而正確的將這個對象在各個繼承層次上申請的所有資源都釋放掉。

    正因為這個原因,在很多C++編程原則的文章或者書里都會提到這樣的原則:

    如果一個類要被設(shè)計為可被繼承的基類,那么其析構(gòu)函數(shù)應(yīng)該被聲明為虛函

數(shù)。

   虛函數(shù)在QT中的應(yīng)用

    在QT里虛函數(shù)的應(yīng)用非常的廣泛,事實上,在大多數(shù)的C++類庫里都不可避免

的要使用到虛函數(shù)。這里簡單的列舉QT里使用虛函數(shù)的情況:

    QT的事件機(jī)制

    是使用了虛函數(shù)的,你因此才可以自定義事件處理函數(shù)。比如最核心的

QObject類的定義里(在qobject.h里),我們可以看到如下的虛函數(shù)定義:

    virtual bool event(QEvent *);

    virtual bool eventFilter(QObject *, QEvent *);

    然后,在QWidget類繼承QObject類后重新實現(xiàn)了上面的兩個虛函數(shù),完成很

多窗口控件類的缺省事件處理。

    當(dāng)你要編寫自定義的QT控件的時候,對event虛函數(shù)的重新實現(xiàn)就更是重要啦

。

    QT的信號和槽

    QT的槽函數(shù)可以被聲明為虛函數(shù),所以雖然QT在實現(xiàn)信號和槽機(jī)制的時候可

能出于效率或者運行代價的原因未采用虛函數(shù)機(jī)制,但是我們依然可以在必要的

時候使用虛函數(shù)來完成一些特定功能。比如為一些自定義控件類抽象出來一個抽

象接口基類,在做信號和槽的連接的時候是對基類指針進(jìn)行操作,而在基類里的

槽定義為虛函數(shù),那么虛函數(shù)在此依然可以實現(xiàn)信號與槽的多態(tài)。

    然而虛函數(shù)在調(diào)用的時候,一定要經(jīng)歷查表的步驟,是存在一定的運行開銷

的,對于一些非常頻繁的槽調(diào)用還是應(yīng)該考慮到使用虛函數(shù)產(chǎn)生的代價的。

    其他

    在虛函數(shù)上,static和inline這兩個關(guān)鍵詞與virtual顯得很不友好。

    從語義上即可看出,static和virtual完全就是沖突的,所以如果你試圖為一

個虛函數(shù)增加一個static限定詞,那么你的C++編譯器就會很負(fù)責(zé)任的報告一個嚴(yán)

重錯誤給你。

    而inline的含義和虛函數(shù)其實也是非常沖突的,但是inline在語法上只是給

編譯器一個建議,而不是強(qiáng)制的語義限定,所以C++編譯器應(yīng)該會忽略掉inline關(guān)

鍵詞,繼續(xù)正常的編譯。

 

posted on 2009-08-05 17:47 chaosuper 閱讀(310) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久九九精品99国产精品| 久久久久国产免费免费| 欧美精品一区二区三区在线看午夜| 国产一区二区三区久久悠悠色av| 亚洲一区久久久| 亚洲在线免费| 国产欧美一区视频| 欧美一级专区| 黑人巨大精品欧美黑白配亚洲| 久久精品亚洲热| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲黄色小视频| 亚洲免费观看| 国产欧美精品一区二区三区介绍| 久久av最新网址| 久久久久国产精品一区三寸| 亚洲国产日韩一级| 99亚洲一区二区| 国产一区二区在线观看免费播放| 玖玖综合伊人| 欧美日韩一区二区三区视频 | 小黄鸭精品密入口导航| 激情丁香综合| 亚洲精品国产精品乱码不99按摩| 欧美日韩免费视频| 久久av一区二区三区漫画| 久久久久久亚洲精品杨幂换脸| 亚洲日产国产精品| 亚洲欧美中文另类| 亚洲国产中文字幕在线观看| 亚洲视频在线看| 在线日韩av| 亚洲欧美国产毛片在线| 亚洲精品三级| 久久国产精品久久久久久| 一本色道久久加勒比88综合| 欧美一区二区三区视频免费| 一区二区国产日产| 久久久久久婷| 久久精品在线视频| 国产精品久久久久久福利一牛影视| 久久综合九色综合欧美就去吻| 欧美日韩一二三区| 欧美丰满高潮xxxx喷水动漫| 国产日韩欧美日韩大片| 亚洲精选久久| 91久久国产综合久久91精品网站| 午夜一区不卡| 亚洲欧美日本精品| 欧美日韩精品在线观看| 欧美黑人国产人伦爽爽爽| 国产日本欧美视频| 亚洲视频自拍偷拍| 亚洲视频在线二区| 欧美激情精品久久久久久| 你懂的国产精品| 樱花yy私人影院亚洲| 午夜精品在线看| 午夜视频一区在线观看| 国产精品99免费看 | 久久久久成人网| 欧美中文在线观看| 国产精品系列在线| 亚洲免费一区二区| 欧美亚洲一区二区在线| 欧美日韩免费一区| 日韩系列欧美系列| 亚洲一区免费看| 国产精品久久久久久妇女6080 | 亚洲国产成人porn| 亚洲国产精品传媒在线观看 | 国产欧美一区二区三区沐欲| 亚洲视频免费| 性欧美videos另类喷潮| 国产精品国产自产拍高清av王其| 夜夜嗨av一区二区三区| 亚洲综合第一| 国产欧美一区二区三区久久 | 欧美一区二区三区视频免费播放| 亚洲欧美日韩国产中文在线| 国产精品免费观看视频| 亚洲一区二区在线免费观看| 欧美在线1区| 在线看片第一页欧美| 免费成人在线观看视频| 亚洲国产一二三| 亚洲天堂av在线免费| 国产精品你懂的在线| 欧美在线免费视频| 蜜月aⅴ免费一区二区三区| 亚洲激情视频在线| 欧美调教视频| 欧美中文在线观看| 亚洲国产精品嫩草影院| 亚洲午夜精品久久| 精久久久久久| 欧美日韩一区二区国产| 久久国产精品网站| 91久久国产自产拍夜夜嗨| 欧美一级播放| 亚洲日本精品国产第一区| 国产精品国产三级国产专区53 | 老司机aⅴ在线精品导航| 日韩视频欧美视频| 免费h精品视频在线播放| 亚洲网站在线| 亚洲激情欧美| 国产欧美一区二区白浆黑人| 免费观看在线综合色| 亚洲一区国产视频| 亚洲黄色成人| 久久久久99| 亚洲免费视频网站| 亚洲激情自拍| 国产一区激情| 国产精品久久久久影院色老大 | 欧美一区二区在线免费观看 | 久久国产精品99国产精| 99国产精品久久久久久久久久 | 精品成人在线视频| 欧美无砖砖区免费| 免费一级欧美片在线播放| 亚洲综合色视频| 99v久久综合狠狠综合久久| 美女精品国产| 久久激情视频| 欧美一区二区三区久久精品茉莉花| 最新日韩精品| 亚洲欧洲一区二区在线播放| 好男人免费精品视频| 国产精品尤物| 国产精品丝袜白浆摸在线| 欧美日韩一区二区三| 欧美成人一区二免费视频软件| 久久激情综合网| 午夜精品视频网站| 亚洲一区在线免费观看| 亚洲作爱视频| 一区二区电影免费观看| 亚洲日本欧美日韩高观看| 亚洲国产小视频| 亚洲国产精品视频| 亚洲国产日韩在线| 亚洲欧洲精品一区| 日韩亚洲精品电影| 一区二区三区日韩精品| 一区二区三区免费网站| 一本高清dvd不卡在线观看| 亚洲免费不卡| 亚洲午夜av电影| 亚洲网站啪啪| 性视频1819p久久| 久久av一区| 毛片一区二区三区| 欧美精品一卡二卡| 欧美日韩在线看| 国产酒店精品激情| 狠狠色香婷婷久久亚洲精品| 影音先锋中文字幕一区| 亚洲国产精品久久久久秋霞不卡| 亚洲国产成人久久综合一区| 亚洲乱码国产乱码精品精| 一本色道久久综合亚洲精品不| 亚洲淫片在线视频| 性刺激综合网| 欧美1区2区3区| 99在线热播精品免费| 欧美一区二区三区四区在线观看| 欧美在线在线| 欧美精品99| 国产色综合天天综合网| 亚洲大胆人体在线| 一本色道久久综合狠狠躁的推荐| 亚洲欧美在线磁力| 蜜臀va亚洲va欧美va天堂| 亚洲日韩成人| 欧美一区二区三区成人| 欧美激情在线免费观看| 国产亚洲成精品久久| 亚洲欧洲在线一区| 欧美在现视频| 亚洲精品在线看| 久久av资源网| 欧美色图麻豆| 亚洲国产精品第一区二区| 亚洲欧美日韩国产综合在线| 老司机久久99久久精品播放免费| 日韩一区二区精品视频| 久久久久综合| 国产精品亚洲一区二区三区在线| 亚洲第一页在线| 性欧美video另类hd性玩具| 欧美激情a∨在线视频播放| 亚洲天堂网在线观看| 男同欧美伦乱| 国内精品久久久久影院色| 亚洲影视中文字幕| 亚洲精品免费一二三区| 久久夜色精品国产欧美乱| 国产欧美日韩在线|