• <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>

            elva

            C++常識之——多態(tài)與重載

            一.多態(tài)

            多態(tài)(Polymorphism)按字面的意思就是“多種形狀”。引用Charlie Calverts對多態(tài)的描述——多態(tài)性是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作(摘自“Delphi4 編程技術(shù)內(nèi)幕”)。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態(tài)性在Object Pascal和C++中都是通過虛函數(shù)(Virtual Function) 實(shí)現(xiàn)的。

              多態(tài)性是允許將父對象設(shè)置成為和一個和多個它的子對象相等的技術(shù),比如Parent:=Child; 多態(tài)性使得能夠利用同一類(基類)類型的指針來引用不同類的對象,以及根據(jù)所引用對象的不同,以不同的方式執(zhí)行相同的操作.
              多態(tài)的作用:把不同的子類對象都當(dāng)作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
              賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。
              舉個例子:從一個基類中派生,響應(yīng)一個虛命令,產(chǎn)生不同的結(jié)果。
              比如從某個基類繼承出多個對象,其基類有一個虛方法Tdoit,然后其子類也有這個方法,但行為不同,然后這些子對象中的任何一個可以附給其基類的對象,這樣其基類的對象就可以執(zhí)行不同的操作了。實(shí)際上你是在通過其基類來訪問其子對象的,你要做的就是一個賦值操作。
              使用繼承性的結(jié)果就是可以創(chuàng)建一個類的家族,在認(rèn)識這個類的家族時,就是把導(dǎo)出類的對象 當(dāng)作基類的的對象,這種認(rèn)識又叫作upcasting。這樣認(rèn)識的重要性在于:我們可以只針對基類寫出一段程序,但它可以適 應(yīng)于這個類的家族,因?yàn)榫幾g器會自動就找出合適的對象來執(zhí)行操作。這種現(xiàn)象又稱為多態(tài)性。而實(shí)現(xiàn)多態(tài)性的手段又叫稱動態(tài)綁定(dynamic binding)。
              簡單的說,建立一個父類的變量,它的內(nèi)容可以是這個父類的,也可以是它的子類的,當(dāng)子類擁有和父類同樣的函數(shù),當(dāng)使用這個變量調(diào)用這個函數(shù)的時候,定義這個變量的類,也就是父類,里的同名函數(shù)將被調(diào)用,當(dāng)在父類里的這個函數(shù)前加virtual關(guān)鍵字,那么子類的同名函數(shù)將被調(diào)用
              class A {
              public:
              A() {}
              virtual void foo() {
              cout << "This is A." << endl;
              }
              };
              class B : public A {
              public:
              B() {}
              void foo() {
              cout << "This is B." << endl;
              }
              };
              int main(int argc, char* argv[]) {
              A *a = new B();
              a->foo();
              return 0;
              }
              這將顯示:
              This is B.
              如果把virtual去掉,將顯示:
              This is A.
              前面的多態(tài)實(shí)現(xiàn)使用抽象類,并定義了虛方法.

            二.重載

            重載決策是一種編譯時機(jī)制,用于在給定了參數(shù)列表和一組候選函數(shù)成員的情況下,選擇一個最佳函數(shù)成員來實(shí)施調(diào)用。函數(shù)重載就是一個類中有幾個同名函數(shù)但參數(shù)表不同:

            重載分為普通方法重載和基類(也就是父類)虛方法的重載!

            普通方法的重載指的是:類中兩個以上的方法(包括隱藏的繼承而來的方法),取的名字相同,但使用的參數(shù)類型或者參數(shù)個數(shù)不同!

            對基類方法的重載是函數(shù)重載的另一種特殊形式。在派生類中重新定義此虛函數(shù)!方法名稱,返回值類型,參數(shù)表中的參數(shù)個數(shù),類型,順序都必須和基類中的虛函數(shù)完全一致!在派生類中聲明對虛方法的重載,要求在聲明中加上override關(guān)鍵字,而且不能有new,static或virtual修飾符!(這是轉(zhuǎn)載別人的,其實(shí)這個是重寫override)

            posted on 2009-08-19 09:56 葉子 閱讀(2550) 評論(0)  編輯 收藏 引用 所屬分類: C\C++

            久久综合伊人77777| 日韩AV无码久久一区二区| 国产精品99久久久久久人| 好久久免费视频高清| 国产国产成人久久精品| 亚洲国产成人久久笫一页| 久久男人Av资源网站无码软件| 国产精品99久久精品| 久久伊人五月丁香狠狠色| 久久国产色AV免费观看| 欧美粉嫩小泬久久久久久久| 亚洲国产精品18久久久久久| 久久久久亚洲精品无码网址| 久久综合综合久久综合| 久久精品国产精品亜洲毛片 | 久久久久久久久久久久中文字幕 | 久久久久亚洲AV成人网| 一本一本久久A久久综合精品| 狠狠色丁香久久综合婷婷| 亚洲欧美精品一区久久中文字幕| 国产精品久久久久久久| 精品一二三区久久aaa片| 久久乐国产精品亚洲综合| 久久综合九色综合精品| 少妇高潮惨叫久久久久久| 亚洲精品成人久久久| 精品国产热久久久福利| 久久青青草原国产精品免费| 久久国产乱子伦免费精品| 国内精品九九久久精品| 亚洲午夜福利精品久久| 久久久久99精品成人片| 国产精品九九久久免费视频| 一本大道久久a久久精品综合| 国产日产久久高清欧美一区| 亚洲AV乱码久久精品蜜桃| 亚洲色大成网站www久久九| 久久伊人精品一区二区三区| 狠狠色噜噜色狠狠狠综合久久| 狠狠综合久久AV一区二区三区| 国产A级毛片久久久精品毛片|