對(duì)象和實(shí)體的區(qū)別 什么叫做多態(tài)性 ?在C 中是如何實(shí)現(xiàn)多態(tài)的?
什么叫做多態(tài)性 ?在C 中是如何實(shí)現(xiàn)多態(tài)的?C 中的多態(tài)(雖然多態(tài)不是C 所特有的,但是C 中的多態(tài)確實(shí)是很特殊的)分為靜多態(tài)和動(dòng)多態(tài)(也就是靜態(tài)綁定和動(dòng)態(tài)綁定兩種現(xiàn)象),靜動(dòng)的區(qū)別主要在于這
什么叫做多態(tài)性 ?在C 中是如何實(shí)現(xiàn)多態(tài)的?
C 中的多態(tài)(雖然多態(tài)不是C 所特有的,但是C 中的多態(tài)確實(shí)是很特殊的)分為靜多態(tài)和動(dòng)多態(tài)(也就是靜態(tài)綁定和動(dòng)態(tài)綁定兩種現(xiàn)象),靜動(dòng)的區(qū)別主要在于這種綁定發(fā)生在編譯期還是運(yùn)行期,發(fā)生在編譯期的是靜態(tài)綁定,也就是靜多態(tài);發(fā)生在運(yùn)行期的則是動(dòng)態(tài)綁定,也就是動(dòng)多態(tài)。靜多態(tài)可以通過(guò)模板和函數(shù)重載來(lái)實(shí)現(xiàn)(之所說(shuō)C 中的多態(tài)主要還是因?yàn)槟0暹@個(gè)東西),下面舉兩個(gè)例子:1)函數(shù)模板template
C 的多態(tài)如何在編譯和運(yùn)行期實(shí)現(xiàn)?
C 的多態(tài)實(shí)現(xiàn)方式主要有函數(shù)重載(包括運(yùn)算符函數(shù))、模板、以及虛函數(shù)等。目的是通過(guò)同一函數(shù)名來(lái)調(diào)用實(shí)際上不同的函數(shù)體,以提高程序的可重用性和可擴(kuò)展性。
函數(shù)重載與模板采用靜態(tài)聯(lián)編方式,即在編譯的時(shí)候就確定了函數(shù)調(diào)用的所有信息。函數(shù)重載可以是類的成員函數(shù)和友元函數(shù),也可以是類外普通函數(shù)。具體調(diào)用時(shí)通過(guò)實(shí)參的個(gè)數(shù)、或“類型和順序”進(jìn)行判斷,所以在定義時(shí)這些同名函數(shù)的形參個(gè)數(shù)或“類型和順序”就必須有所不同。
虛函數(shù)采用動(dòng)態(tài)聯(lián)編方式,允許函數(shù)調(diào)用與函數(shù)體的聯(lián)系在運(yùn)行時(shí)才建立,根據(jù)對(duì)象類型來(lái)調(diào)用相應(yīng)的函數(shù)。虛函數(shù)必須是類的成員函數(shù)(非靜態(tài)成員函數(shù)),必須在基類中聲明,在派生類中重新定義,而且其函數(shù)類型、函數(shù)名、參數(shù)個(gè)數(shù)及順序都必須和基類中函數(shù)原型完全相同。具體調(diào)用時(shí)需要通過(guò)基類指針指向派生類對(duì)象來(lái)獲得運(yùn)行時(shí)多態(tài),根據(jù)指針?biāo)赶虻膶?shí)際對(duì)象調(diào)該其成員函數(shù)。
簡(jiǎn)單列出兩個(gè)使用虛函數(shù)注意事項(xiàng)。
1)只有通過(guò)基類指針訪問(wèn)虛函數(shù)才能獲得運(yùn)行時(shí)多態(tài)特性。直接使用派生類對(duì)象和點(diǎn)運(yùn)算符也可以調(diào)用到虛函數(shù),但是沒(méi)有利用到其運(yùn)行多態(tài)特性。
2)在派生類中重新定義虛函數(shù)時(shí),如果其參數(shù)的個(gè)數(shù)、類型和順序與基類虛函數(shù)原型有所不同,系統(tǒng)將會(huì)把其當(dāng)做普通函數(shù)重載看待,進(jìn)行靜態(tài)聯(lián)編,因此無(wú)論怎么調(diào)用都不會(huì)具有運(yùn)行多態(tài)特性。
C 中,static成員函數(shù)可以表現(xiàn)出運(yùn)行時(shí)多態(tài)性嗎?
static成員函數(shù)就是有命名空間的全局函數(shù) 不具有普通面向?qū)ο笮问降亩鄳B(tài)性!
Java的哪個(gè)語(yǔ)法特性讓你覺(jué)得寫(xiě)Java代碼很享受?
本人在日常主要使用的語(yǔ)言為c#和Java,就語(yǔ)法而言,寫(xiě)c#更讓人享受。主要原因?yàn)閏#更多的語(yǔ)法糖,linq真的好用,其次visual studio號(hào)稱宇宙第一IDE。但是個(gè)人還是更愿意用java。
從java8出來(lái)后,感覺(jué)java在追趕著c#的步伐, java和c#的語(yǔ)法上越來(lái)越像(本來(lái)也挺像的,哈哈)。以下做一個(gè)小小的比較。
c#
java
以上實(shí)現(xiàn)的功能差不多,在java8中加入lambda表達(dá)式后,個(gè)人感覺(jué)越來(lái)越像c#了。
拋開(kāi)語(yǔ)法層面,現(xiàn)在來(lái)說(shuō)一說(shuō)為什么更愿意用java
1、首先當(dāng)然是看收益啦,在國(guó)內(nèi)基本上沒(méi)有用c#的大廠,本來(lái)攜程在用,后來(lái)也轉(zhuǎn)為java了。
2、從技術(shù)層面來(lái)講,因?yàn)閖ava造輪子的多,有很多優(yōu)秀的框架可以使用。在實(shí)際做項(xiàng)目中你遇到的問(wèn)題,其他人肯定遇到過(guò),能夠很好的找到問(wèn)題關(guān)鍵。
3、從生態(tài)上來(lái)講,Java無(wú)疑是最好的選擇之一,因?yàn)槠溟_(kāi)源的早,建立生態(tài)的時(shí)間早。
4、從性能來(lái)說(shuō),Sun/Oracle的HotSpot JVM內(nèi)置的JIT編譯器在運(yùn)行時(shí)對(duì)字節(jié)碼已經(jīng)做出了非常大的優(yōu)化努力,如果不是對(duì)性能十分敏感的應(yīng)用,java足夠用了。
謝謝。
C 的動(dòng)態(tài)約束是什么意思?
多態(tài)性也稱后約束或動(dòng)態(tài)約束,它常用虛函數(shù)來(lái)實(shí)現(xiàn)。在C 中,多態(tài)性是指C 的代碼可以根據(jù)運(yùn)行情況的不同而執(zhí)行不同的操作。C 的多態(tài)性就是為同一個(gè)函數(shù)和運(yùn)算符定義幾個(gè)版本。C 支持兩種多態(tài)性,編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。編譯時(shí)的多態(tài)性通過(guò)使用重載函數(shù)獲得,運(yùn)行時(shí)的多態(tài)性通過(guò)使用繼承和虛函數(shù)來(lái)獲得。在C 中,多態(tài)性的實(shí)現(xiàn)與函數(shù)聯(lián)編有關(guān),C 中有兩種函數(shù)聯(lián)編(綁定):靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編。靜態(tài)聯(lián)編是在程序編譯時(shí)進(jìn)行的;動(dòng)態(tài)聯(lián)編是在程序運(yùn)行時(shí)進(jìn)行的。
要獲得多態(tài)性的對(duì)象,必須建立一個(gè)類等級(jí),然后在派生類中重定義基類函數(shù),該函數(shù)可以被定義為重載函數(shù)或函數(shù)或虛函數(shù),以獲得編譯時(shí)的多態(tài)性對(duì)象或運(yùn)行時(shí)的多態(tài)性對(duì)象。