3278 7840

          1100111010001110 1001010010001010

          多態(tài)

          多態(tài)(Polymorphism)按字面的意思就是“多種形狀”。引用Charlie Calverts對(duì)多態(tài)的描述——多態(tài)性是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作(摘自“Delphi4 編程技術(shù)內(nèi)幕”)。簡(jiǎn)單的說(shuō),就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態(tài)性在Object Pascal和C++中都是通過(guò)虛函數(shù)(Virtual Function) 實(shí)現(xiàn)的。
            多態(tài)性是允許將父對(duì)象設(shè)置成為和一個(gè)或多個(gè)它的子對(duì)象相等的技術(shù),比如Parent:=Child; 多態(tài)性使得能夠利用同一類(基類)類型的指針來(lái)引用不同類的對(duì)象,以及根據(jù)所引用對(duì)象的不同,以不同的方式執(zhí)行相同的操作.
            多態(tài)的作用:把不同的子類對(duì)象都當(dāng)作父類來(lái)看,可以屏蔽不同子類對(duì)象之間的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
            賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。也就是說(shuō),父親的行為像兒子,而不是兒子的行為像父親。
            舉個(gè)例子:從一個(gè)基類中派生,響應(yīng)一個(gè)虛命令,產(chǎn)生不同的結(jié)果。
            比如從某個(gè)基類繼承出多個(gè)對(duì)象,其基類有一個(gè)虛方法Tdoit,然后其子類也有這個(gè)方法,但行為不同,然后這些子對(duì)象中的任何一個(gè)可以附給其基類的對(duì)象,這樣其基類的對(duì)象就可以執(zhí)行不同的操作了。實(shí)際上你是在通過(guò)其基類來(lái)訪問(wèn)其子對(duì)象的,你要做的就是一個(gè)賦值操作。
            使用繼承性的結(jié)果就是可以創(chuàng)建一個(gè)類的家族,在認(rèn)識(shí)這個(gè)類的家族時(shí),就是把導(dǎo)出類的對(duì)象 當(dāng)作基類的的對(duì)象,這種認(rèn)識(shí)又叫作upcasting。這樣認(rèn)識(shí)的重要性在于:我們可以只針對(duì)基類寫出一段程序,但它可以適 應(yīng)于這個(gè)類的家族,因?yàn)榫幾g器會(huì)自動(dòng)就找出合適的對(duì)象來(lái)執(zhí)行操作。這種現(xiàn)象又稱為多態(tài)性。而實(shí)現(xiàn)多態(tài)性的手段又叫稱動(dòng)態(tài)綁定(dynamic binding)。
            簡(jiǎn)單的說(shuō),建立一個(gè)父類的變量,它的內(nèi)容可以是這個(gè)父類的,也可以是它的子類的,當(dāng)子類擁有和父類同樣的函數(shù),當(dāng)使用這個(gè)變量調(diào)用這個(gè)函數(shù)的時(shí)候,定義這個(gè)變量的類,也就是父類,里的同名函數(shù)將被調(diào)用,當(dāng)在父類里的這個(gè)函數(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)使用抽象類,并定義了虛方法.

          posted on 2009-06-15 21:13 逍遙晨空 閱讀(187) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 南昌县| 枞阳县| 平江县| 临安市| 望江县| 聂拉木县| 扎赉特旗| 潍坊市| 博野县| 勃利县| 中宁县| 托克逊县| 云霄县| 康保县| 合阳县| 瑞昌市| 淄博市| 安远县| 阿勒泰市| 阳春市| 读书| 武乡县| 商都县| 乐东| 滕州市| 肥乡县| 象山县| 仙桃市| 衡水市| 华容县| 龙州县| 始兴县| 新和县| 镇雄县| 东阿县| 叶城县| 宁安市| 高要市| 宜春市| 奇台县| 平阳县|