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