国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

李明明 管志偉

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

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

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

1虛函數(shù)

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

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

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

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

2純虛函數(shù)

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

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

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

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

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

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

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

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

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

3實(shí)現(xiàn)原理

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

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

那么如何定位虛表呢?

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

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

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

4結(jié)語(yǔ)

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

[參考文獻(xiàn)]

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

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

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

猜你喜歡
基類(lèi)子類(lèi)編譯器
基于C#面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝、繼承和多態(tài)分析
卷入Hohlov算子的某解析雙單葉函數(shù)子類(lèi)的系數(shù)估計(jì)
基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
關(guān)于對(duì)稱(chēng)共軛點(diǎn)的倒星象函數(shù)某些子類(lèi)的系數(shù)估計(jì)
空戰(zhàn)游戲設(shè)計(jì)實(shí)例
一種基于用戶(hù)興趣的STC改進(jìn)算法
虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》中的教學(xué)方法研究
通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
塊H矩陣新的子類(lèi)
關(guān)于Java繼承性的探討
江华| 赣榆县| 阳东县| 江油市| 遂溪县| 台中市| 毕节市| 翼城县| 武鸣县| 凌源市| 临安市| 保康县| 新田县| 宝丰县| 措美县| 萨迦县| 察雅县| 青河县| 南江县| 夏邑县| 绥宁县| 海安县| 恭城| 大埔县| 绥棱县| 隆昌县| 敖汉旗| 米泉市| 彰武县| 工布江达县| 乐亭县| 莱阳市| 蓬安县| 板桥市| 淳安县| 济源市| 封丘县| 岳阳市| 上杭县| 金寨县| 嫩江县|