多態性也分靜態多態性和動態多態性兩種。靜態多態性是指定義在壹個類或壹個函數中的同名函數,它們根據參數表(類型以及個數)區別語義,並通過靜態聯編實現,例如,在壹個類中定義的不同參數的構造函數。動態多態性是指定義在壹個類層次的不同類中的重載函數,它們壹般具有相同的函數,因此要根據指針指向的對象所在類來區別語義,它通過動態聯編實現。
“多態性”壹詞最早用於生物學,指同壹種族的生物體具有相同的特性。在面向對象理論中,多態性的定義是:同壹操作作用於不同的類的實例,將產生不同的執行結果,即不同類的對象收到相同的消息時,得到不同的結果。多態性包含編譯時的多態性、運行時的多態性兩大類。
動態多態是指發出同樣的消息被不同類型的對象接收時,有可能導致完全不同的行為。即,在用戶不作任何幹預的環境下,類的成員函數的行為能根據調用它的對象類型自動作出適應性調整,而且調整是發生在程序運行時。 多態是面向對象程序設計的重要特征之壹。是擴展性在“繼承”之後的又壹重大表現 。
比方壹下:
妳和妳朋友都是煙鬼,
某日,妳沒有帶煙, 而妳朋友有n種煙,
妳說: 來根煙,
朋友給妳壹根;
妳通過煙的過濾嘴, 品出為白沙煙
妳再要壹根,
品出這次是芙蓉王,
再要壹根,
品出這次是熊貓
...
上面描述的就是多態!
煙 a = 白沙
煙 b = 芙蓉王
煙 c = 熊貓
但發現沒有, 僅僅通過"煙"基類, 引用到不同的具體類對象,
就能讓妳調用到不同的對象, 這就是多態.
而煙到妳嘴裏[此時妳還沒有發現是那種煙], 妳僅僅憑借"吸"的動作,就識別出來,到底是哪種煙對象
這就是多態的懸機.
多態須具備:
1. 基類 和各個子類
2. 基類 引用, 指向實例化的子類對象.
再舉壹個雞的例子,
雞是所有其它雞的基類, 定義了壹個方法shape(), 此方法能指明雞的形態. 所有的子類[火雞,山雞,田雞等],都有這個shape方法, 表明自己的形態,
如果用下面的方法定義我需要具體的雞,
[基類 引用 = 實現類的對象]
for example:
雞 a = new 火雞();
雞 a = new 田雞();
雞 a = new 山雞();
雞 a = new 母雞();
當我使用的時候, 我采用 a 這個引用,
a.shape(), 就會得到雞的形態.
如果我定義的是
雞 a = new 火雞();
那麽a.shape得到的是火雞的形態, 而不需要用具體的
火雞 a = new 火雞(); 再通過a.shape得到火雞的形態