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

天行健 君子當(dāng)自強(qiáng)而不息

【ZT】C++批判(4)


函數(shù)重載

 C++允許在參數(shù)類(lèi)型不同的前提下重載函數(shù)。重載的函數(shù)與具有多態(tài)性的函數(shù)(即虛函數(shù))不同處在于:調(diào)用正確的被重載函數(shù)實(shí)體是在編譯期間就被決定了的;而對(duì)于具有多態(tài)性的函數(shù)來(lái)說(shuō),是通過(guò)運(yùn)行期間的動(dòng)態(tài)綁定來(lái)調(diào)用我們想調(diào)用的那個(gè)函數(shù)實(shí)體。多態(tài)性是通過(guò)重定義(或重寫(xiě))這種方式達(dá)成的。請(qǐng)不要被重載 (overloading)和重寫(xiě)(overriding)所迷惑。重載是發(fā)生在兩個(gè)或者是更多的函數(shù)具有相同的名字的情況下。區(qū)分它們的辦法是通過(guò)檢測(cè)它們的參數(shù)個(gè)數(shù)或者類(lèi)型來(lái)實(shí)現(xiàn)的。重載與CLOS中的多重分發(fā)(multiple dispatching)不同,對(duì)于參數(shù)的多重分發(fā)是在運(yùn)行期間多態(tài)完成的。
 
 【Reade 89】中指出了重載與多態(tài)之間的不同。重載意味著在相同的上下文中使用相同的名字代替出不同的函數(shù)實(shí)體(它們之間具有完全不同的定義和參數(shù)類(lèi)型)。多態(tài)則只具有一個(gè)定義體,并且所有的類(lèi)型都是由一種最基本的類(lèi)型派生出的子類(lèi)型。C. Strachey指出,多態(tài)是一種參數(shù)化的多態(tài),而重載則是一種特殊的多態(tài)。用以判斷不同的重載函數(shù)的機(jī)制就是函數(shù)標(biāo)示(function signature)。
 
 重載在下面的例子中顯得很有用:

 max( int, int )
 max( real, real )

 
  這將確保相對(duì)于類(lèi)型int和real的最佳的max函數(shù)實(shí)體被調(diào)用。但是,面向?qū)ο蟮某绦蛟O(shè)計(jì)為該函數(shù)提供了一個(gè)變量,對(duì)象本身被被當(dāng)作一個(gè)隱藏的參數(shù)傳遞給了函數(shù)(在C++中,我們把它稱(chēng)為this)。由于這樣,在面向?qū)ο蟮母拍钪杏蛛[式地包含了一種對(duì)等的但卻更有更多限制的形式。對(duì)于上述討論的一個(gè)簡(jiǎn)單例子如下:

 int i, j;
 real r, s;
 i.max(j);
 r.max(s);

 
 但如果我們這樣寫(xiě):i.max(r),或是r.max(j),編譯器將會(huì)告訴我們?cè)谶@其中存在著類(lèi)型不匹配的錯(cuò)誤。當(dāng)然,通過(guò)重載運(yùn)算符的操作,這樣的行為是可以被更好地表達(dá)如下:

 i max j 或者 r max s

 但是,min和max都是特殊的函數(shù),它們可以接受兩個(gè)或者更多的同一類(lèi)型的參數(shù),并且還可以作用在任意長(zhǎng)度的數(shù)組上。因此,在Eiffel中,對(duì)于這種情況最常見(jiàn)的代碼形式看起來(lái)就像這樣:

 il:COMPARABLE_LIST[INTEGER]
 rl:COMPARABLE_LIST[REAL]
 
 i := il.max
 r := rl.max

 
  上面的例子顯示,面向?qū)ο蟮木幊痰浞?paradigm),特別是和范型化(genericity)結(jié)合在一起時(shí),也可以達(dá)到函數(shù)重載的效果而不需要C+ +中的函數(shù)重載那樣的聲明形式。然而是C++使得這種概念更加一般化。C++這樣作的好處在于,我們可以通過(guò)不止一個(gè)的參數(shù)來(lái)達(dá)到重載的目的,而不是僅使用一個(gè)隱藏的當(dāng)前對(duì)象作為參數(shù)這樣的形式。
 
 另外一個(gè)我們需要考慮的因素是,決定(resolved)哪個(gè)重載函數(shù)被調(diào)用是在編譯階段完成的事情,但對(duì)于重寫(xiě)來(lái)說(shuō)則推后到了運(yùn)行期間。這樣看起來(lái)好像重載能夠使我們獲得更多性能上的好處。然而,在全局分析的過(guò)程中編譯器可以檢測(cè)函數(shù)min 和max是否處在繼承的最末端,然后就可以直接的調(diào)用它們(如果是的話(huà))。這也就是說(shuō),編譯器檢查到了對(duì)象i和r,然后分析對(duì)應(yīng)于它們的max函數(shù),發(fā)現(xiàn)在這種情況下沒(méi)有任何多態(tài)性被包含在內(nèi),于是就為上面的語(yǔ)句產(chǎn)生了直接調(diào)用max的目標(biāo)代碼。與此相反的是,如果對(duì)象n被定義為一個(gè)NUMBER, NUMBER又提供一個(gè)抽象的max函數(shù)聲明(我們所用的REAL.max和INTERGER.max都是從它繼承來(lái)的),那么編譯器將會(huì)為此產(chǎn)生動(dòng)態(tài)綁定的代碼。這是因?yàn)閚既可能是INTEGER,也有可能是REAL。
 
 現(xiàn)在你是不是覺(jué)得C++的這種方法(即通過(guò)提供不同的參數(shù)來(lái)實(shí)現(xiàn)函數(shù)的重載)很有用?不過(guò)你還必須明白,面向?qū)ο蟮某绦蛟O(shè)計(jì)對(duì)此有著種種的限制,存在著許多的規(guī)則。C++是通過(guò)指定參數(shù)必須與基類(lèi)相符合的方式實(shí)現(xiàn)它的。傳入函數(shù)中的參數(shù)只能是基類(lèi),或是基類(lèi)的派生類(lèi)。

例如:

 A.f( B someB )
 class B ...;
 class D : public B ...;
 A a;
 D d;
 a.f( d );


 其中d必須與類(lèi)'B'相符,編譯器會(huì)檢測(cè)這些。
 
  通過(guò)不同的函數(shù)簽名(signature)來(lái)實(shí)現(xiàn)函數(shù)重載的另一種可行的方法是,給不同的函數(shù)以不同的名字,以此來(lái)使得它們的簽名不同。我們應(yīng)該使用名字來(lái)作為區(qū)分不同實(shí)體(entities)的基礎(chǔ)。編譯器可以交叉檢測(cè)我們提供的實(shí)參是否符合于指定的函數(shù)需要的形參。這同時(shí)也導(dǎo)致了軟件更好的自記錄(self-document)。從相似的名字選擇出一個(gè)給指定的實(shí)體通常都不會(huì)很容易,但它的好處確實(shí)值得我們這樣去做。
 
 [Wiener95]中提供了一個(gè)例子用以展示重載虛擬函數(shù)可能出現(xiàn)的問(wèn)題:

 class Parent
 {
  public:
   virutal int doIt( int v )
   {
    return v * v;
   }
 };
 
 class Child: public Parent
 {
  public:
   int doIt( int v, int av = 20 )
   {
    return v * av;
   }
 };
 
 int main()
 {
  int i;
  Parent *p = new Child();
  i = p->doIt(3);
  return 0;
 }

 
 當(dāng)程序執(zhí)行完后i會(huì)等于多少呢?有人可能會(huì)認(rèn)為是60,然而結(jié)果卻是9。這是因?yàn)樵贑hild中doIt的簽名與在Parent中的不一致,它并沒(méi)有重寫(xiě)Parent中的doIt,而僅僅是重載了它,在這種情況下,缺省值沒(méi)有任何作用。

再來(lái)看看這個(gè)例子,絕對(duì)讓你抓狂,猜猜看輸出的i和j值是多少?

#include <stdio.h>

class PARENT
{
public:
    virtual int doIt( int v, int av = 10 )
    {
         return v * v;
    }
};

class CHILD : public PARENT
{
public:
    int doIt( int v, int av = 20 )
    {
         return v * av;
    }
};

int main()
{
    PARENT *p = new CHILD();

    int i = p->doIt(3);
    printf("i = %d\n", i);

    CHILD* q = new CHILD();

    int j = q->doIt(3);
    printf("j = %d\n", j);

    return 0;
}

 
 Java也提供了方法重載,不同的方法可以擁有同樣的名字及不同的簽名。
 
 在Eiffel中沒(méi)有引入新的技術(shù),而是使用范型化、繼承及重定義等。Eiffel提供了協(xié)變式的簽名方式,這意味著在子類(lèi)的函數(shù)中不需要完全符合父類(lèi)中的簽名,但是通過(guò)Eiffel的強(qiáng)類(lèi)型檢測(cè)技術(shù)可以使得它們彼此相匹配。
 

posted on 2007-09-27 13:24 lovedday 閱讀(404) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): ▲ C++ Program

公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(lèi)(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(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>
            欧美激情精品久久久久久| 日韩视频中午一区| 欧美制服第一页| 欧美在线视频观看免费网站| 国产精品久久久久久久午夜| av不卡在线| 一区二区三欧美| 国产日产欧美一区| 久久久久国产一区二区三区四区| 欧美成人r级一区二区三区| 91久久精品www人人做人人爽| 亚洲电影下载| 欧美日韩免费观看一区=区三区| 99国产精品久久久久久久久久| 亚洲欧美中文另类| 1024成人| 国产精品亚洲а∨天堂免在线| 欧美专区第一页| 亚洲人成亚洲人成在线观看图片| 午夜亚洲福利在线老司机| 在线观看亚洲精品视频| 欧美日韩dvd在线观看| 午夜精品久久久| 亚洲精品中文字幕女同| 久久久久久国产精品mv| 日韩视频欧美视频| 激情综合五月天| 国产精品亚洲欧美| 欧美日韩亚洲一区二区| 久久婷婷国产综合精品青草| 亚洲欧美另类国产| 激情自拍一区| 国产农村妇女精品一二区| 欧美精品三级日韩久久| 美国成人直播| 久久久久青草大香线综合精品| 中国av一区| 在线亚洲免费视频| 亚洲精品免费在线播放| 最新高清无码专区| 亚洲国产mv| 亚洲欧洲一区二区天堂久久 | 欧美久久久久久久久久| 久久中文久久字幕| 久久中文欧美| 欧美日韩高清在线观看| 欧美日韩1区2区| 欧美偷拍另类| 欧美另类极品videosbest最新版本| 欧美v日韩v国产v| 欧美成人免费在线观看| 欧美激情精品| 国产精品国码视频| 国产视频一区二区三区在线观看| 国产精品免费观看在线| 国产精品视频观看| 激情一区二区| 亚洲精选在线观看| 午夜日韩激情| 看片网站欧美日韩| 亚洲欧洲在线看| 一本色道久久综合亚洲精品小说 | 国产日韩综合| 亚洲第一区中文99精品| 91久久久在线| 亚洲欧美激情一区二区| 久久国产精品99久久久久久老狼 | 亚洲一区二区在线免费观看视频 | 亚洲欧洲av一区二区| 久久久久久欧美| 国产精品久久9| 亚洲国产精品国自产拍av秋霞| 在线亚洲伦理| 免费美女久久99| 亚洲视频国产视频| 美国十次成人| 国产在线播精品第三| 亚洲视频图片小说| 久久综合九色欧美综合狠狠| 91久久精品一区| 久久久久天天天天| 国产精品羞羞答答| 亚洲综合成人在线| 91久久国产综合久久91精品网站| 午夜在线精品偷拍| 国产精品美女午夜av| 99在线精品观看| 欧美aa在线视频| 久久国产一区| 国内激情久久| 久久精品欧美日韩| 亚洲欧美日韩精品综合在线观看 | 午夜欧美电影在线观看| 夜夜嗨av一区二区三区网站四季av | 国产亚洲欧美另类中文| 亚洲女ⅴideoshd黑人| 亚洲人永久免费| 欧美乱人伦中文字幕在线| 在线播放日韩专区| 乱中年女人伦av一区二区| 午夜激情综合网| 国产一区二区成人| 久久九九久久九九| 久久免费一区| 日韩视频亚洲视频| 日韩亚洲一区二区| 国产精品美女久久久久久久| 亚洲欧美在线一区二区| 欧美一区二区三区免费大片| 国产午夜久久| 免费观看亚洲视频大全| 久久综合免费视频影院| 亚洲国产精品一区| 亚洲精品色图| 国产伦一区二区三区色一情| 久久婷婷激情| 欧美激情亚洲视频| 亚洲一区中文字幕在线观看| 亚洲欧美成人网| 亚洲福利一区| 亚洲视频免费在线| 狠狠狠色丁香婷婷综合激情| 亚洲国产精品高清久久久| 欧美精品在线观看播放| 欧美伊人久久大香线蕉综合69| 午夜一区在线| 一本色道久久99精品综合| 亚洲自拍16p| 日韩视频一区| 久久精品一区二区三区四区| 一级日韩一区在线观看| 欧美在线三区| 亚洲综合激情| 久久综合九色欧美综合狠狠| 亚洲欧美日韩精品久久亚洲区| 美女久久一区| 久久美女性网| 国产精品系列在线播放| 亚洲高清视频在线观看| 国产一区二区三区观看| 亚洲精品中文字| 亚洲美女电影在线| 久久久欧美一区二区| 久久av资源网| 欧美亚州韩日在线看免费版国语版| 老司机精品导航| 国产亚洲成人一区| 亚洲一区二区三| 亚洲永久精品国产| 99视频热这里只有精品免费| 欧美在线视屏| 久久av最新网址| 国产性做久久久久久| 欧美激情导航| 美女脱光内衣内裤视频久久网站| 国产欧美精品一区二区色综合| 亚洲五月婷婷| 亚洲精品一区二区三区樱花| 亚洲国产日韩欧美在线99 | 午夜精品久久久久久99热软件| 亚洲尤物在线| 国产一区二区无遮挡| 久久爱www久久做| 欧美成人精品一区二区| 亚洲国产第一页| 欧美精品久久久久a| 日韩视频在线免费| 午夜精品亚洲一区二区三区嫩草| 国产精品日韩欧美大师| 午夜精品999| 欧美国产先锋| 亚洲伊人久久综合| 国产精品sss| 久久福利一区| 亚洲欧洲精品一区二区精品久久久| 一区二区三区导航| 国产一区二区精品| 模特精品裸拍一区| 亚洲午夜在线观看视频在线| 久久精品视频va| 一区二区免费看| 国产一区二区三区成人欧美日韩在线观看 | 亚洲美女少妇无套啪啪呻吟| 欧美在线3区| 99精品国产在热久久婷婷| 欧美日韩一区在线视频| 欧美中文字幕| 亚洲免费观看视频| 免费不卡亚洲欧美| 午夜日韩在线| 亚洲一区二区精品视频| 亚洲国产91精品在线观看| 国产精品久久久久久户外露出| 久久久人人人| 亚洲欧美一级二级三级| 亚洲日本久久| 欧美激情亚洲国产| 免费看av成人| 久久免费国产| 久久精品一区二区三区不卡|