多態(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) 編輯 收藏