重載與重寫的區(qū)別 java 什么是多態(tài)?在C 中多態(tài)是如何實現(xiàn)的?
什么是多態(tài)?在C 中多態(tài)是如何實現(xiàn)的?C中的多態(tài)性(雖然多態(tài)性不是C特有的,但C有兩種多態(tài)性:靜態(tài)多態(tài)性和動態(tài)多態(tài)性(即靜態(tài)綁定和動態(tài)綁定)。靜態(tài)和動態(tài)的主要區(qū)別在于綁定是發(fā)生在編譯時還是運行時。編
什么是多態(tài)?在C 中多態(tài)是如何實現(xiàn)的?
C中的多態(tài)性(雖然多態(tài)性不是C特有的,但C有兩種多態(tài)性:靜態(tài)多態(tài)性和動態(tài)多態(tài)性(即靜態(tài)綁定和動態(tài)綁定)。靜態(tài)和動態(tài)的主要區(qū)別在于綁定是發(fā)生在編譯時還是運行時。編譯時發(fā)生的綁定是靜態(tài)綁定,即靜態(tài)多態(tài)性;運行時發(fā)生的綁定是動態(tài)綁定,即動態(tài)多態(tài)性。靜態(tài)多態(tài)性可以通過模板和函數(shù)重載來實現(xiàn)(C語言中的多態(tài)性主要是模板造成的)。這里有兩個例子:1)函數(shù)模板的多態(tài)性
C主要包括函數(shù)重載(包括運算符函數(shù))、模板和虛函數(shù)。其目的是用相同的函數(shù)名調(diào)用不同的函數(shù)體,以提高程序的可重用性和可擴展性。
函數(shù)重載和模板是靜態(tài)組合的,即函數(shù)調(diào)用的所有信息在編譯時確定。函數(shù)重載可以是類的成員函數(shù)和友元函數(shù),也可以是類外的普通函數(shù)。實際參數(shù)的個數(shù)或“類型和順序”用于確定特定的調(diào)用,因此定義時,這些同名函數(shù)的形式參數(shù)或“類型和順序”的個數(shù)必須不同。
虛擬函數(shù)采用動態(tài)綁定方式,允許在運行時建立函數(shù)調(diào)用與函數(shù)體的連接,并根據(jù)對象類型調(diào)用相應(yīng)的函數(shù)。虛函數(shù)必須是類的成員函數(shù)(非靜態(tài)成員函數(shù))。它必須在基類中聲明,并在派生類中重新定義。此外,它的函數(shù)類型、函數(shù)名、參數(shù)個數(shù)和順序必須與基類中的函數(shù)原型完全相同。具體調(diào)用需要通過基類指針指向派生類對象來獲得運行時多態(tài)性,并根據(jù)指針指向的實際對象調(diào)用成員函數(shù)。
簡單列出使用虛擬函數(shù)的兩個注意事項。
1)運行時多態(tài)性只能通過通過基類指針訪問虛擬函數(shù)來獲得。直接使用派生類對象和點運算符也可以調(diào)用虛函數(shù),但它沒有利用其多態(tài)性。
2)在派生類中重新定義虛函數(shù)時,如果其參數(shù)的個數(shù)、類型和順序與基類的虛函數(shù)原型不同,系統(tǒng)會將其作為普通函數(shù)重載進行靜態(tài)綁定,因此無論如何調(diào)用,都不會有運行多態(tài)性。
C 多態(tài)是怎么實現(xiàn)的?
多態(tài)性分為編譯時多態(tài)性和運行時多態(tài)性。
1. 編譯時多態(tài)性,其實是方法重載,函數(shù)名相同,但簽名不一樣。值得注意的是,簽名不包括方法的返回值。換句話說,這兩個方法的函數(shù)名和輸入?yún)?shù)是相同的,但返回值不同。編譯器返回錯誤。
2. 運行時多態(tài)性實際上與繼承和接口實現(xiàn)有關(guān)。子類可以重寫父類的非最終、非靜態(tài)、非私有方法或?qū)崿F(xiàn)接口方法。JVM如何知道要調(diào)用哪個子類實例的對應(yīng)方法?這就是你問的問題。在Java中,對象在JVM中有描述元數(shù)據(jù)。對象頭存儲當(dāng)前實例的類型信息。在調(diào)用時,JVM可以根據(jù)這個類型準(zhǔn)確地找出要使用的子類方法。
什么是多態(tài)?java中如何實現(xiàn)多態(tài)?
你好,我是[最大的敵人戰(zhàn)勝自己]。我很高興為你回答。C、 實現(xiàn)多態(tài)性的方法有:虛函數(shù)、抽象類、覆蓋、模板(重載和多態(tài)無關(guān))。虛函數(shù)是指在基類中聲明為虛并在一個或多個派生類中重新定義的成員函數(shù)。用法格式為:virtual function返回type function name(parameter table){function body};要實現(xiàn)多態(tài)性,可以通過指向派生類的基類指針或引用來訪問派生類中包含相同名稱的成員函數(shù)。為了使類是抽象的,C必須至少有一個純虛函數(shù)。包含至少一個純虛函數(shù)的類被認(rèn)為是抽象類。比較專業(yè)的理科知識,歡迎關(guān)注我。如果你喜歡我的回答,也請給我表揚或轉(zhuǎn)發(fā),你的鼓勵是支持我寫下來的動力,謝謝。
如何實現(xiàn)C語言的多態(tài)?
最簡單的方法是將函數(shù)指針存儲在結(jié)構(gòu)中,然后在初始化結(jié)構(gòu)時將函數(shù)的地址分配給它。如果稍微復(fù)雜一點的話,我們就要用虛函數(shù)表(其實記錄函數(shù)名對應(yīng)的函數(shù)地址是好的)根據(jù)C的多態(tài)性原理記錄每個結(jié)構(gòu)的成員函數(shù)地址,然后在每個結(jié)構(gòu)中多存儲一個虛函數(shù)表的地址。。。然后在調(diào)用函數(shù)時,函數(shù)地址被強烈轉(zhuǎn)換為函數(shù)類型,然后被調(diào)用。你可以自己研究C的虛函數(shù)表機制。