多態性包括以下編譯時
❶ 什麼是多態
多態首先是建立在繼承的基礎上的,先有繼承才能有多態。多態是指不同的子類在繼承父類後分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現出不同的形式。多態成立的另一個條件是在創建子類時候必須使用父類new子類的方式。
多態(Polymorphism)按字面的意思就是「多種狀態」。在面向對象語言中,介面的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自「Delphi4編程技術內幕」)。
簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。
拓展資料:
多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對象的,而不是面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。
多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。
OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法。
多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。
多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。
把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。
使用繼承性的結果就是當創建了一個類的家族,在認識這個類的家族時,就是把子類的對象當作基類的對象,這種認識又叫作upcasting(向上轉型)。這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。
簡單的說,建立一個父類對象的引用,它所指對象可以是這個父類的對象,也可以是它的子類的對象。java中當子類擁有和父類同樣的函數,當通過這個父類對象的引用調用這個函數的時候,調用到的是子類中的函數。
❷ 多態的表現形式是什麼
多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對象的,而不是面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。
運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。
多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。
OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法
多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。
多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。
(2)多態性包括以下編譯時擴展閱讀:
多態作用:
把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。
舉個例子:從一個基類中派生,響應一個虛命令,產生不同的結果。
比如從某個基類派生出多個子類,其基類有一個虛方法Tdoit,然後其子類也有這個方法,但行為不同,然後這些子類對象中的任何一個可以賦給其基類對象的引用。
或者說將子對象地址賦給基類指針,這樣其基類的對象就可以執行不同的操作了。實際上你是在通過其基類的引用來訪問其子類對象的,你要做的就是一個賦值操作。
使用繼承性的結果就是當創建了一個類的家族,在認識這個類的家族時,就是把子類的對象當作基類的對象,這種認識又叫作upcasting(向上轉型)。
這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。
❸ 什麼是多態性
多態性就是多種表現形式,具體來說,可以用"一個對外介面,多個內在實現方法"表示。舉一個例子,計算機中的堆棧可以存儲各種格式的數據,包括整型,浮點或字元。不管存儲的是何種數據,堆棧的演算法實現是一樣的。針對不同的數據類型,編程人員不必手工選擇,只需使用統一介面名,系統可自動選擇。
多態性也分靜態多態性和動態多態性兩種。靜態多態性是指定義在一個類或一個函數中的同名函數,它們根據參數表(類型以及個數)區別語義,並通過靜態聯編實現,例如,在一個類中定義的不同參數的構造函數。動態多態性是指定義在一個類層次的不同類中的重載函數,它們一般具有相同的函數,因此要根據指針指向的對象所在類來區別語義,它通過動態聯編實現。
「多態性」一詞最早用於生物學,指同一種族的生物體具有相同的特性。在面向對象理論中,多態性的定義是:同一操作作用於不同的類的實例,將產生不同的執行結果,即不同類的對象收到相同的消息時,得到不同的結果。多態性包含編譯時的多態性、運行時的多態性兩大類。
動態多態是指發出同樣的消息被不同類型的對象接收時,有可能導致完全不同的行為。即,在用戶不作任何干預的環境下,類的成員函數的行為能根據調用它的對象類型自動作出適應性調整,而且調整是發生在程序運行時。 多態是面向對象程序設計的重要特徵之一。是擴展性在「繼承」之後的又一重大表現 。
比方一下:
你和你朋友都是煙鬼,
某日,你沒有帶煙, 而你朋友有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得到火雞的形態
❹ 多態分為哪兩中
在JAVA中有兩種多態是指:運行時多態和編譯時多態。
關於類的多態性簡介如下:
多態(polymorphism)意為一個名字可具有多種語義.在程序設計語言中,多態性是指」一種定義,多種實現」.例如,運算符+有多種含義,究竟執行哪種運算取決於參加運算的操作數類型:
1+2 //加法運算符
「1」 + 「2」 //字元串連接運算,操作數是字元串
多態性是面向對象的核心特徵之一,類的多態性提供類中成員設計的靈活性和方法執行的多樣性.
1、類多態性表現
(1)方法重載
重載表現為同一個類中方法的多態性.一個類生命多個重載方法就是為一種功能提供多種實現.編譯時,根據方法實際參數的數據類型\個數和次序,決定究竟應該執行重載方法中的哪一個.
(2)子類重定義從父類繼承來的成員
當子類從父類繼承來的成員不適合子類時,子類不能刪除它們,但可以重定義它們,使弗雷成員適應子類的新需求.子類重定義父類成員,同名成員在父類與子類之間表現出多態性,父類對象引用父類成員,子類對象引用子類成員,不會產生沖突和混亂.
子類可重定義父類的同名成員變數,稱子類隱藏父類成員變數.子類也可以重定義父類的同名成員方法,當子類方法的參數列表與父類方法參數列表完全相同時,稱為子類方法覆蓋(override)父類方法。覆蓋父類方法時,子類方法的訪問許可權不能小於父類方法的許可權。
由於Object類的equals()方法比較兩個對象的引用是否相等而不是值是否相等,因此一個類要覆蓋Object類的equals()方法,提供本類兩個對象比較相等方法.
覆蓋表現為父類與子類之間方法的多態性.java 尋找執行方法的原則是:從對象所屬的類開始,尋找匹配的方法執行,如果當前類中沒有匹配的方法,則逐層向上依次在父類或祖先類中尋找匹配方法,直到Object類.
2、super 引用
在子類的成員方法中,可以使用代詞super引用父類成員.super引用的語法如下:
super([參數列表]) //在子類的構造方法體中,調用父類的構造方法
super.成員變數 //當子類隱藏父類成員變數時,引用父類同名成員變數
super.成員方法([參數列表]) //當子類覆蓋父類成員方法時,調用父類同名成員方法
*注意:super引用沒有單獨使用的語法
3、多態性有兩種:
1)編譯時多態性
對於多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱為編譯時多態性.
2)運行時多態性
如果在編譯時不能確定,只能在運行時才能確定執行多個同名方法中的哪一個,則稱為運行時多態性.
方法覆蓋表現出兩種多態性,當對象獲得本類實例時,為編譯時多態性,否則為運行時多態性,例如:
XXXX x1 = new XXXX(參數列表); //對象獲得本類實例,對象與其引用的實例類型一致
XXX xx1 = new XXX(參數列表);
x1.toString(); //編譯時多態性,執行XXX類的方法.
xx1.toString(); //編譯時多態性,執行XXXX類覆蓋的方法.
XXXX為XXX的父類.
由於子類對象既是父類對象,父類對象與子類對象之間具有賦值相容性,父類對象能夠被賦值為子類對象.例如,
XXXX x2 = new XXX(參數列表); //父類對象獲得子類實例,子類對象即是父類對象
x2.toString(); //運行時多態
x2聲明為父類對象卻獲得子類XXX的實例,那麼x2.toString()究竟執行父類方法還是執行子類覆蓋的方法呢?
這分為兩種情況:
取決於子類是否覆蓋父類方法.如果子類覆蓋父類方法,則執行子類方法;
如果沒有覆蓋,則執行父類方法.
在編譯時,僅僅依據對象所屬的類,系統無法確定到底應該執行那個類的方法,只有運行時才能確定,因此這是運行時多態.
父類對象並不能執行所有的子類方法,只能執行那些父類中聲明\子類覆蓋的子類方法.
❺ 解釋多態性
多態性分生物上的概念和計算機技術上的概念,以下是兩個領域的對於多態性的有關解釋,希望對你有用
1 多態性是指一個基因座位上存在多個等位基因。就某一個體基因座位而言,最多隻能有兩個等位基因,分別來自父母方的同源染色體上。因而, MHC 多態性指的是一個群體概念,即群體中不同個體在等位基因擁有狀態上存在的差別。 HLA 是人體中多態性最豐富的基因系統,其等位基因的數目有 1031 個之多,且均為共顯性基因,若按隨機組合,人群中的基因型可達 10 12 種。因此,人群中除同卵雙生外,無關個體間 HLA 型別完全相同的可能性極小。 HLA 多態性主要表現在經典的 I 、 II 類基因,這與 I 、 II 類基因產物參與提呈抗原肽有關。 MHC 多態性使得種群能對各種病原體產生合適的免疫應答,應付多變的環境條件,以維持群體的穩定性。
在遺傳生態學上一般用遺傳多樣性,比如同一物種遺傳後代的多樣性、種群遺傳多樣性、品種遺傳多樣性。
而在遺傳學、分子遺傳學等領域用多態性,比如基因多態性、電泳條帶的多態性等.
說遺傳多態性的比較少見,一般說DNA多態性等,比如利用 DNA 多態性進行多種突變檢測,用於物種鑒定,種群結構分析和遺傳多樣性研究。不過也有少數用遺傳多態性表示的,但其前面一般加上個定語,如DNA遺傳多態性,同工酶遺傳多態性。
2 多態性的實現與靜態聯編、動態聯編有關。靜態聯編支持的多態性稱為編譯時的多態性,也稱靜態多態性,它是通過函數重載和運算符重載實現的。動態聯編支持的多態性稱為運行時的多態性,也稱動態多態性,它是通過繼承和虛函數實現的。
C++允許在參數類型不同的前提下重載函數。重載的函數與具有多態性的函數(即虛函數)不同處在於:調用正確的被重載函數實體是在編譯期間就被決定了的;而對於具有多態性的函數來說,是通過運行期間的動態綁定來調用我們想調用的那個函數實體。多態性是通過重定義(或重寫)這種方式達成的。請不要被重載(overloading)和重寫(overriding)所迷惑。重載是發生在兩個或者是更多的函數具有相同的名字的情況下。區分它們的辦法是通過檢測它們的參數個數或者類型來實現的。重載與CLOS中的多重分發(multiple dispatching)不同,對於參數的多重分發是在運行期間多態完成的。
❻ c++中,可將多態性分為編譯時的多態性和()
編譯時的多態性:就是在程序編譯的時候,也就是生成解決方案的時候就決定要實現什麼操作。而運行時的多態性:就是指直到系統運行時,才根據實際情況決定實現何種操作。
❼ 什麼是多態它的種類有哪些,請舉例說明
多態性:顧名思義就是擁有「多種形態」的含義,是指屬性或方法在子類中表現為多種形態。它包括兩種類型:靜態多態性:包括變數的隱藏、方法的重載(指同一個類中,方法名相同[方便記憶],但是方法的參數類型、個數、次序不同,本質上是多個不同的方法);動態多態性:是指子類在繼承父類(或實現介面)時重寫了父類(或介面)的方法,程序中用父類(或介面)引用去指向子類的具體實例,從代碼形式上看是父類(或介面)引用去調用父類(介面)的方法,但是在實際運行時,JVM能夠根據父類(或介面)引用所指的具體子類,去調用對應子類的方法,從而表現為不同子類對象有多種不同的形態。不過,程序代碼在編譯時還不能確定調用的哪一個類的方法,只有在運行時才能確定,故又稱為運行時的多態性。
❽ 多態性的程序設計多態性
「多態性」一詞最早用於生物學,指同一種族的生物體具有不同的特性。在面向對象的程序設計理論中,多態性的定義是:同一操作作用於不同的類的實例,將產生不同的執行結果,即不同類的對象收到相同的消息時,得到不同的結果。多態是面向對象程序設計的重要特徵之一,是擴展性在「繼承」之後的又一重大表現 。對象根據所接受的消息而做出動作,同樣的消息被不同的對象接受時可能導致完全不同的行為,這種現象稱為多態性。
多態性包含編譯時的多態性、運行時的多態性兩大類。 即:多態性也分靜態多態性和動態多態性兩種。 動態多態性是指定義在一個類層次的不同類中的重載函數,它們一般具有相同的函數,因此要根據指針指向的對象所在類來區別語義,它通過動態聯編實現。
在用戶不作任何干預的環境下,類的成員函數的行為能根據調用它的對象類型自動作出適應性調整,而且調整是發生在程序運行時,這就是程序的動態多態性。即,發出同樣的消息被不同類型的對象接收時,有可能導致完全不同的行為。 多態性就是多種表現形式,具體來說,可以用一個對外介面,多個內在實現方法表示。舉一個例子,計算機中的堆棧可以存儲各種格式的數據,包括整型,浮點或字元。不管存儲的是何種數據,堆棧的演算法實現是一樣的。針對不同的數據類型,編程人員不必手工選擇,只需使用統一介面名,系統可自動選擇。
舉例子說明一下: #include<iostream>std::cout;classA{public:virtualvoidtest(){cout<<aaa<<endl;}//運行時的多態性,如果不加virtual就是編譯時的多態//voidtest(){cout<<aaa<<endl;}//編譯時的多態性};classB:publicA{public:voidtest(){cout<<bbb<<endl;}};classC:publicB{public:voidtest(){cout<<ccc<<endl;}};voidmain(){Ccc;A*p=&cc;p->test();}在Class A的test函數前加上virtual,即在運行時多態的時候,程序輸出結果為:ccc
在Class A的test函數前不加virtual,即在編譯時多態的時候,程序輸出結果為:aaa
C++的多態性:在基類的函數前面加上Virtual關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數。