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

posts - 195,  comments - 30,  trackbacks - 0

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jiangnanyouzi/archive/2009/01/06/3720807.aspx
1、c++實(shí)現(xiàn)多態(tài)的方法

其實(shí)很多人都知道,虛函數(shù)在c++中的實(shí)現(xiàn)機(jī)制就是用虛表和虛指針,但是具體是怎樣的呢?從more effecive c++其中一篇文章里面可以知道:是每個(gè)類用了一個(gè)虛表,每個(gè)類的對(duì)象用了一個(gè)虛指針。具體的用法如下:

class A
{
public:
    virtual void f();
    virtual void g();
private:
    int a
};

class B : public A
{
public:
    void g();
private:
    int b;
};

//A,B的實(shí)現(xiàn)省略

因?yàn)锳有virtual void f(),和g(),所以編譯器為A類準(zhǔn)備了一個(gè)虛表vtableA,內(nèi)容如下:

A::f 的地址
 
A::g 的地址
 

B因?yàn)槔^承了A,所以編譯器也為B準(zhǔn)備了一個(gè)虛表vtableB,內(nèi)容如下:

A::f 的地址
B::g 的地址

注意:因?yàn)锽::g是重寫了的,所以B的虛表的g放的是B::g的入口地址,但是f是從上面的A繼承下來(lái)的,所以f的地址是A::f的入口地址。

然后某處有語(yǔ)句 B bB;的時(shí)候,編譯器分配空間時(shí),除了A的int a,B的成員int b;以外,還分配了一個(gè)虛指針vptr,指向B的虛表vtableB,bB的布局如下:

vptr : 指向B的虛表vtableB
 
int a: 繼承A的成員
 
int b: B成員
 

當(dāng)如下語(yǔ)句的時(shí)候:
A *pa = &bB;

pa的結(jié)構(gòu)就是A的布局(就是說(shuō)用pa只能訪問(wèn)的到bB對(duì)象的前兩項(xiàng),訪問(wèn)不到第三項(xiàng)int b)

那么pa->g()中,編譯器知道的是,g是一個(gè)聲明為virtual的成員函數(shù),而且其入口地址放在表格(無(wú)論是vtalbeA表還是vtalbeB表)的第2項(xiàng),那么編譯器編譯這條語(yǔ)句的時(shí)候就如是轉(zhuǎn)換:call *(pa->vptr)[1](C語(yǔ)言的數(shù)組索引從0開始哈~)。

這一項(xiàng)放的是B::g()的入口地址,則就實(shí)現(xiàn)了多態(tài)。(注意bB的vptr指向的是B的虛表vtableB)

另外要注意的是,如上的實(shí)現(xiàn)并不是唯一的,C++標(biāo)準(zhǔn)只要求用這種機(jī)制實(shí)現(xiàn)多態(tài),至于虛指針vptr到底放在一個(gè)對(duì)象布局的哪里,標(biāo)準(zhǔn)沒(méi)有要求,每個(gè)編譯器自己決定。我以上的結(jié)果是根據(jù)g++ 4.3.4經(jīng)過(guò)反匯編分析出來(lái)的。

2、兩種多態(tài)實(shí)現(xiàn)機(jī)制及其優(yōu)缺點(diǎn)

除了c++的這種多態(tài)的實(shí)現(xiàn)機(jī)制之外,還有另外一種實(shí)現(xiàn)機(jī)制,也是查表,不過(guò)是按名稱查表,是smalltalk等語(yǔ)言的實(shí)現(xiàn)機(jī)制。這兩種方法的優(yōu)缺點(diǎn)如下:

(1)、按照絕對(duì)位置查表,這種方法由于編譯階段已經(jīng)做好了索引和表項(xiàng)(如上面的call *(pa->vptr[1]) ),所以運(yùn)行速度比較快;缺點(diǎn)是:當(dāng)A的virtual成員比較多(比如1000個(gè)),而B重寫的成員比較少(比如2個(gè)),這種時(shí)候,B的vtableB的剩下的998個(gè)表項(xiàng)都是放A中的virtual成員函數(shù)的指針,如果這個(gè)派生體系比較大的時(shí)候,就浪費(fèi)了很多的空間。

比如:GUI庫(kù),以MFC庫(kù)為例,MFC有很多類,都是一個(gè)繼承體系;而且很多時(shí)候每個(gè)類只是1,2個(gè)成員函數(shù)需要在派生類重寫,如果用C++的虛函數(shù)機(jī)制,每個(gè)類有一個(gè)虛表,每個(gè)表里面有大量的重復(fù),就會(huì)造成空間利用率不高。于是MFC的消息映射機(jī)制不用虛函數(shù),而用第二種方法來(lái)實(shí)現(xiàn)多態(tài),那就是:

(2)、按照函數(shù)名稱查表,這種方案可以避免如上的問(wèn)題;但是由于要比較名稱,有時(shí)候要遍歷所有的繼承結(jié)構(gòu),時(shí)間效率性能不是很高。(關(guān)于MFC的消息映射的實(shí)現(xiàn),看下一篇文章)

3、總結(jié):

如果繼承體系的基類的virtual成員不多,而且在派生類要重寫的部分占了其中的大多數(shù)時(shí)候,用C++的虛函數(shù)機(jī)制是比較好的;

但是如果繼承體系的基類的virtual成員很多,或者是繼承體系比較龐大的時(shí)候,而且派生類中需要重寫的部分比較少,那就用名稱查找表,這樣效率會(huì)高一些,很多的GUI庫(kù)都是這樣的,比如MFC,QT

PS. 其實(shí),自從計(jì)算機(jī)出現(xiàn)之后,時(shí)間和空間就成了永恒的主題,因?yàn)閮烧咴?8%的情況下都無(wú)法協(xié)調(diào),此長(zhǎng)彼消;這個(gè)就是計(jì)算機(jī)科學(xué)中的根本瓶頸之所在。軟件科學(xué)和算法的發(fā)展,就看能不能突破這對(duì)時(shí)空權(quán)衡了。呵呵

何止計(jì)算機(jī)科學(xué)如此,整個(gè)宇宙又何嘗不是如此呢?最基本的宇宙之謎,還是時(shí)間和空間

posted on 2011-03-07 15:41 luis 閱讀(327) 評(píng)論(0)  編輯 收藏 引用

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


<2013年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

文章分類

文章檔案

友情鏈接

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜一区二区| 亚洲尤物视频在线| 欧美日韩伦理在线| 欧美精品一区二区三区一线天视频 | 欧美一区二区三区另类 | 欧美婷婷久久| 国产精品爱久久久久久久| 国产精品xxxxx| 国产午夜精品福利| 精品白丝av| 99天天综合性| 午夜久久久久久| 蜜臀久久久99精品久久久久久| 欧美主播一区二区三区| 欧美体内she精视频在线观看| 国产精品久久久99| 激情小说另类小说亚洲欧美| 日韩一级在线观看| 久久久久久9| 亚洲乱码国产乱码精品精天堂 | 一区二区三区色| 欧美在线观看视频一区二区| 久久一区二区三区av| 欧美日韩久久| 国产欧美精品一区| 亚洲免费成人| 久久精品国产一区二区三区免费看 | 欧美日韩99| 国产亚洲高清视频| 亚洲国产精彩中文乱码av在线播放| 宅男噜噜噜66一区二区| 久久激情久久| 国产精一区二区三区| 国产亚洲精久久久久久| 国产一区二区三区av电影| 99精品福利视频| 免费欧美在线视频| 欧美在线视频一区二区| 国产精品igao视频网网址不卡日韩| 在线不卡视频| 久久精品一区二区| 亚洲综合电影一区二区三区| 欧美久久久久久久久久| 亚洲国产精品va| 久久精品国产精品亚洲| 亚洲一区二区3| 欧美日韩系列| 亚洲免费观看视频| 91久久精品国产91久久| 久久精品国产综合| 久久爱另类一区二区小说| 国产精品入口尤物| 亚洲影音一区| 亚洲午夜国产一区99re久久| 久久久精品日韩| 香蕉尹人综合在线观看| 亚洲美女免费视频| 欧美精彩视频一区二区三区| 亚洲激情视频在线| 亚洲激情小视频| 久久精品国产在热久久| 欧美国产精品| 亚洲综合日本| 欧美在线一二三区| 亚洲欧美一区二区三区极速播放 | 国产精品午夜视频| 午夜精品成人在线| 亚洲自拍啪啪| 亚洲人成在线影院| 欧美亚洲在线视频| 欧美在线视频导航| 亚洲二区在线| 亚洲激情在线| 欧美视频导航| 久久精品亚洲国产奇米99| 久久精品国产精品亚洲精品| 亚洲成人在线视频网站| 亚洲国产精品悠悠久久琪琪| 欧美日韩国产影片| 午夜精品免费视频| 久久精品官网| 日韩视频专区| 亚洲免费小视频| 农夫在线精品视频免费观看| 在线观看日韩av先锋影音电影院| 久久久精品午夜少妇| 玖玖在线精品| 亚洲免费在线视频| 久久男人资源视频| 亚洲天堂av在线免费观看| 国产午夜亚洲精品不卡| 欧美影院视频| 欧美激情在线有限公司| 久久国产精品久久久久久久久久 | 久久久免费av| 亚洲午夜伦理| 久久久久久91香蕉国产| 一本色道久久综合亚洲精品小说 | 欧美性大战xxxxx久久久| 久久久久91| 中文在线资源观看视频网站免费不卡| 91久久久一线二线三线品牌| 欧美不卡福利| 免费不卡在线视频| 亚洲欧美制服中文字幕| 久久亚洲国产成人| 亚洲永久精品国产| 欧美在线91| 欧美xxxx在线观看| 国产精品网站在线播放| 欧美~级网站不卡| 国产精品稀缺呦系列在线| 欧美国产视频日韩| 国产亚洲精品aa午夜观看| 亚洲免费成人av| 亚洲国产精品热久久| 性色一区二区三区| 亚洲女同性videos| 欧美成人午夜| 免费不卡在线观看av| 国产精品乱码久久久久久| 乱人伦精品视频在线观看| 国产精品免费小视频| 亚洲欧洲精品天堂一级| 久久精品在线视频| 欧美在线观看视频在线| 国产精品va在线| 亚洲精品国产精品国产自| 亚洲大胆视频| 久久久精品午夜少妇| 久久久91精品国产| 日韩一级黄色大片| 免费成人你懂的| 欧美xxx成人| 亚洲国产高清aⅴ视频| 久久精品亚洲一区二区| 久久国产精品久久国产精品| 国产精品爽黄69| 亚洲专区免费| 欧美在线观看天堂一区二区三区| 国产精品捆绑调教| 欧美一区二区三区男人的天堂 | 欧美视频专区一二在线观看| 亚洲福利视频二区| 欧美区在线播放| 亚洲国产欧美国产综合一区| 亚洲高清色综合| 欧美国产日韩亚洲一区| 性欧美激情精品| 99re在线精品| 欧美91大片| 久久精品午夜| 欧美国产日韩一区二区三区| 欧美激情aaaa| 中文日韩电影网站| 国产精品免费一区二区三区观看| 性感少妇一区| 欧美国产高清| 亚洲永久精品大片| 国产亚洲网站| 欧美精品三级| 亚洲自拍偷拍麻豆| 玖玖在线精品| 一区二区高清视频在线观看| 国产精品第三页| 久久久福利视频| 亚洲乱码国产乱码精品精| 欧美一区二区三区视频| 激情久久中文字幕| 欧美日韩一区在线观看| 久久精品91久久香蕉加勒比 | 欧美精品成人| 午夜精品美女久久久久av福利| 免费在线观看成人av| 亚洲婷婷综合色高清在线| 蜜臀久久99精品久久久久久9| 国产精品亚洲成人| 老司机久久99久久精品播放免费| 日韩一级大片| 欧美国产日韩亚洲一区| 亚洲欧美视频在线| 亚洲国产成人午夜在线一区| 国产精品视频久久| 久久大逼视频| 99国内精品久久| 美女诱惑黄网站一区| 性色av一区二区三区红粉影视| 亚洲黄色免费网站| 国内精品美女av在线播放| 欧美午夜久久久| 欧美高清影院| 久久夜色精品一区| 欧美在线免费观看| 亚洲一二三区精品| 在线亚洲一区二区| 亚洲黄色有码视频| 激情视频一区二区三区| 国产欧美日韩视频一区二区| 欧美日韩一区高清| 欧美日韩一区免费|