在我們討論多態的時候,先看看什么是硬編碼和軟編碼:硬編碼就是把代碼寫死了,導致彈性不足,降低了可擴展性,例如在代碼里的: if...else...;switch...case...
這些代碼通常都屬于硬編碼,項目中的這些代碼多了,就相當于說明這個代碼的靈活性、擴展性、彈性等等的少了。
所以,我們要盡量使用軟編碼,通俗點就是“別把話說死了,留點轉彎的余地”。多態性就是這種軟編碼特性的反映,下面我們一起來研究一下多態性。
多態性是一種抽象,把事物的特征抽象出來,然后事物的具體形態我們就不關心了。
例如對工人這種事物來說,他的特征就是工作,至于是什么工人,他做什么工作,我們就不用關心了,只要我們以“工人.工作”這種方式去調用。那他就會為我們工作了。
那為什么我們不抽象出其他的特征,只抽象出工作這個特征呢?因為我們只對這個特征感興趣,他的什么吃飯、睡覺、如廁等的特性我們都不關心了。有了多態,我們就可以實現軟編碼了!
講解了多態的概念之后,我們來看看多態的實現(C++的實現):
多態的實現是通過虛函數表(VTable),每個類如果有虛函數,那它就有一個虛函數表,所有的對象都共享這一個VTable。這個概念也叫做動態聯編,還有靜態聯編,這些概念都是通過在程序執行的時候表現出來的性質來定的,我們下面會看看它的“動”和“靜”究竟體現在哪里。
先看一段代碼:
class C0
...{
public:
void Test()
...{
cout << "call C0 Test()。" << endl;
}
};
這個類沒有虛函數,調用的時候就是靜態調用。調用的代碼如下:
// 靜態編譯(早綁定 early binding)
C0 *pO0;
C0 obj0;
pO0 = &obj0;
pO0->Test();
它的反匯編代碼如下:
// 直接調用函數(已經知道地址)
00401432 mov ecx,dword ptr [ebp-0Ch]
00401435 call @ILT+160(C0::Test) (004010a5)
下面看看帶虛函數的類:
原文轉自:http://www.anti-gravitydesign.com