• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      淺析C++多態(tài)的作用及實現(xiàn)原理

      2014-09-24 00:07:42李明明管志偉
      無線互聯(lián)科技 2014年7期
      關(guān)鍵詞:基類子類編譯器

      李明明 管志偉

      摘要:簡要分析了虛函數(shù),純虛函數(shù),函數(shù)的重載和覆蓋,著重描述了多態(tài)的概念,綁定,使用方法以及實現(xiàn)原理。

      關(guān)鍵詞:多態(tài);虛函數(shù);動態(tài)綁定;靜態(tài)綁定多態(tài)(polymorphism)一詞最初來源于希臘語polumorphos,含義是具有多種形式或形態(tài)的情形。在程序設(shè)計領(lǐng)域,C++是目前面向?qū)ο笳Z言中使用最廣泛的語言之一,多態(tài)性是面向?qū)ο蟮暮诵募夹g(shù),理解多態(tài),是掌握面向?qū)ο蟪绦蛟O(shè)計的必經(jīng)之路。

      為了理解多態(tài),我們必須清楚什么是虛函數(shù)?什么是純虛函數(shù)?為什么要引入虛函數(shù)和純虛函數(shù)?它們在多態(tài)的實現(xiàn)上分別有什么作用?它們之間又有什么區(qū)別?

      1虛函數(shù)

      定義:用virtual關(guān)鍵字申明的函數(shù)叫做虛函數(shù),虛函數(shù)肯定是類的成員函數(shù)。

      引入原因:為了方便使用多態(tài)特性,我們需要在基類中定義虛函數(shù)。

      作用:虛函數(shù)的作用是實現(xiàn)動態(tài)聯(lián)編,也就是在程序的運行階段動態(tài)地選擇合適的成員函數(shù),。

      這里注意:抽象類即含有純虛函數(shù)的類。

      2純虛函數(shù)

      定義:虛函數(shù)再加上=0。

      引入原因:在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出熊貓、野豬等子類,但動物本身生成對象明顯不合常理。為了解決上述問題,將函數(shù)定義為純虛函數(shù),若要使派生類為非抽象類,則編譯器要求在派生類中,必須對純虛函數(shù)予以重寫以實現(xiàn)多態(tài)性。

      作用:通過基類的派生類以純虛函數(shù)為接口實現(xiàn)有意義的虛函數(shù)定義。

      虛函數(shù)和純虛函數(shù)的區(qū)別

      ⑴虛函數(shù)的作用是這個函數(shù)在子類里面可以被重載,運行時動態(tài)綁定實現(xiàn)多態(tài)純虛函數(shù)是個接口,在基類中不實現(xiàn),要等到子類中去實現(xiàn)。

      ⑵虛函數(shù)在子類里可以不重載,但是虛函數(shù)必須在子類里去實現(xiàn)。

      輔助性理論分析結(jié)束,跨入正題,什么是多態(tài)?多態(tài)的作用是什么?它的實現(xiàn)原理具體是什么?

      ⑴定義:對于面向?qū)ο蟪绦蛟O(shè)計(OOP)的核心——“多態(tài)”,引用Charlie Calverts對多態(tài)的描述——“多態(tài)”即是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運作。簡單地說就是“一個接口,多種方法”。

      ⑵作用:把不同的子類對象都當(dāng)作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。

      3實現(xiàn)原理

      因為編譯器在編譯的時候,就已經(jīng)確定了對象調(diào)用的函數(shù)的地址,默認(rèn)執(zhí)行基類中函數(shù)方法,此時屬于靜態(tài)綁定。為了能在派生類中使用名稱相同但執(zhí)行命令不同的方法,就必須要使用動態(tài)綁定(late binding)技術(shù),即函數(shù)調(diào)用的地址在運行時才確定。要讓編譯器采用動態(tài)綁定,就要在基類中聲明函數(shù)時使用virtual關(guān)鍵字。

      編譯器在編譯的時候,會為每個包含虛函數(shù)的類創(chuàng)建一個虛表(即vtable),前面已經(jīng)提到,該表是一個一維數(shù)組,在這個數(shù)組中存放每個虛函數(shù)的地址。

      那么如何定位虛表呢?

      編譯器另外還為每個類的對象提供了一個虛表指針(即vptr),這個指針指向了對象所屬類的虛表。在程序運行時,根據(jù)對象的類型去初始化vptr,從而讓vptr正確的指向所屬類的虛表,從而在調(diào)用虛函數(shù)時,就能夠找到正確的函數(shù)。

      在虛表指針沒有正確初始化之前,我們不能夠去調(diào)用虛函數(shù)。那么虛表指針在什么時候,或者說在什么地方初始化呢?

      在構(gòu)造函數(shù)中進行虛表的創(chuàng)建和虛表指針的初始化。對于虛函數(shù)調(diào)用來說,每一個對象內(nèi)部都有一個虛表指針,該虛表指針被初始化為本類的虛表。所以在程序中,不管你的對象類型如何轉(zhuǎn)換,但該對象內(nèi)部的虛表指針是固定的,因此,動態(tài)的對象函數(shù)調(diào)用得以實現(xiàn),這就是C++多態(tài)性實現(xiàn)的原理。

      4結(jié)語

      類的多態(tài)性,是指用虛函數(shù)和延遲綁定來實現(xiàn)的。函數(shù)的多態(tài)性是函數(shù)的重載。一般情況下(沒有涉及virtual函數(shù)),當(dāng)我們用一個指針調(diào)用一個函數(shù)的時候,被調(diào)用的函數(shù)是取決于這個指針的類型。除此之外,當(dāng)設(shè)計到多態(tài)性的時候,采用了虛函數(shù)和動態(tài)綁定,此時的調(diào)用就不會在編譯時候確定而是在運行時確定。

      [參考文獻]

      [1](美)stanley B.LippmanBarbara E.Moo joseeLajoie著.李師賢,等,譯.C++ primer.人民郵電出版社.2006.

      [2](美)普拉塔(prata,S)著.孫建春,韋強,譯.C++ primer plus.人民郵電出版社.2005.

      [3](美)??藸枺˙ruce Eckel),(美) Chuck Allison.劉宗田,袁兆山,潘秋菱,等,譯.C++編程思想.機械工業(yè)出版社.2011.

      猜你喜歡
      基類子類編譯器
      基于C#面向?qū)ο蟪绦蛟O(shè)計的封裝、繼承和多態(tài)分析
      卷入Hohlov算子的某解析雙單葉函數(shù)子類的系數(shù)估計
      基于相異編譯器的安全計算機平臺交叉編譯環(huán)境設(shè)計
      關(guān)于對稱共軛點的倒星象函數(shù)某些子類的系數(shù)估計
      空戰(zhàn)游戲設(shè)計實例
      一種基于用戶興趣的STC改進算法
      虛機制在《面向?qū)ο蟪绦蛟O(shè)計C++》中的教學(xué)方法研究
      通用NC代碼編譯器的設(shè)計與實現(xiàn)
      塊H矩陣新的子類
      關(guān)于Java繼承性的探討
      射阳县| 柏乡县| 泸溪县| 临高县| 新平| 财经| 大余县| 攀枝花市| 巴彦淖尔市| 黎平县| 高碑店市| 岳普湖县| 靖边县| 和静县| 任丘市| 浮梁县| 宾阳县| 万山特区| 黄大仙区| 盐山县| 湟中县| 石河子市| 大兴区| 昌江| 澎湖县| 历史| 阿克苏市| 松滋市| 石门县| 九江市| 乃东县| 青冈县| 建宁县| 永康市| 鄂托克前旗| 河间市| 湘乡市| 辽宁省| 商南县| 南充市| 景德镇市|