亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        OOP C++中的動(dòng)態(tài)多態(tài)性及其底層實(shí)現(xiàn)機(jī)制研究

        2014-10-13 08:26:00馬瑞敏
        長治學(xué)院學(xué)報(bào) 2014年2期
        關(guān)鍵詞:基類多態(tài)指針

        馬瑞敏

        (長治學(xué)院 計(jì)算機(jī)系,山西 長治 046011)

        OOP(Object Oriented Programming)的出現(xiàn)改變了編程者的思維方式,使設(shè)計(jì)程序的出發(fā)點(diǎn)由問題域中的過程轉(zhuǎn)向問題域中的對象及其相互關(guān)系,更加符合人們對客觀事物的認(rèn)識,是目前主流的軟件開發(fā)方法。多態(tài)性是OOP的三大重要概念(封裝性、繼承性、多態(tài)性)之一,理解并掌握好多態(tài)性的實(shí)現(xiàn)和應(yīng)用方法在OOP過程中占有重要的地位。多態(tài)是指類族中具有相似功能的不同函數(shù)使用同一名稱來實(shí)現(xiàn),從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù),又稱為“同一接口,多種方法”。

        1 多態(tài)的類型

        多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類:編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。前者是在編譯時(shí)確定了同名操作的具體操作對象,又稱靜態(tài)多態(tài),函數(shù)及運(yùn)算符的重載、數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換和模板都屬于靜態(tài)多態(tài);后者是在程序運(yùn)行過程中才能動(dòng)態(tài)地確定操作所針對的具體對象,又稱動(dòng)態(tài)多態(tài)??傮w上說,動(dòng)態(tài)多態(tài)才是真正的多態(tài)性。

        2 動(dòng)態(tài)多態(tài)性的實(shí)現(xiàn)

        下面根據(jù)程序Pro1.cpp來分析動(dòng)態(tài)多態(tài)性的實(shí)現(xiàn)。

        圖1 未實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性的運(yùn)行結(jié)果

        圖2 實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性的運(yùn)行結(jié)果

        在程序Pro1.cpp中派生類Derived1和Derived2雖然重寫(重寫是指函數(shù)名、參數(shù)及返回類型都與基類某函數(shù)相同但功能不同的函數(shù))基類Base的成員函數(shù),但根據(jù)賦值兼容與函數(shù)隱藏的規(guī)則,語句“pb->f();”只能訪問到基類Base中的成員函數(shù)f(),不能訪問到派生類中的同名成員函數(shù),運(yùn)行結(jié)果如圖1所示,沒有實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。

        要實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性,需要將基類中的同名函數(shù)定義為虛函數(shù),即在基類的成員函數(shù)聲明前加關(guān)鍵字virtual。同時(shí)還需三個(gè)先行條件:①派生類公有繼承了基類;②在派生類中重寫了同名虛函數(shù);③用派生類對象地址為基類指針賦值,或用派生類對象初始化基類對象的引用。修改Pro1.cpp,在基類Base的成員函數(shù)f前加上virtual關(guān)鍵字,通過基類指針pb指向不同的派生類對象,可以訪問到派生類中的虛函數(shù),從而實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。運(yùn)行結(jié)果如圖2所示。

        C++規(guī)定:若在派生類中重寫了基類的虛函數(shù),即使不添加virtual關(guān)鍵字,它們也自動(dòng)成為了虛函數(shù)。關(guān)鍵字virtual指示C++編譯器對調(diào)用虛函數(shù)進(jìn)行動(dòng)態(tài)聯(lián)編。上述條件③中對虛函數(shù)的調(diào)用也有約定:只能使用指針或引用調(diào)用虛函數(shù),不能使用對象名調(diào)用。因?yàn)槭褂脤ο竺{(diào)用函數(shù)時(shí),函數(shù)調(diào)用與函數(shù)的實(shí)現(xiàn)在編譯階段已經(jīng)確定,無法實(shí)現(xiàn)動(dòng)態(tài)綁定,而指針或引用在程序運(yùn)行過程中可能會(huì)指向同一基類的不同派生類對象,因此使得通過指針或引用調(diào)用虛函數(shù)時(shí),對應(yīng)的函數(shù)實(shí)現(xiàn)代碼需要在程序運(yùn)行過程中才能夠進(jìn)行綁定,從而實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。一個(gè)聲明或繼承了虛函數(shù)的類稱為多態(tài)類。

        3 動(dòng)態(tài)多態(tài)性底層實(shí)現(xiàn)機(jī)制研究

        動(dòng)態(tài)多態(tài)主要通過類的繼承關(guān)系和虛函數(shù)來實(shí)現(xiàn)。虛函數(shù)的底層實(shí)現(xiàn)機(jī)制并未標(biāo)準(zhǔn)化。當(dāng)前主流的C++編譯器如Visual C++、Borland C++等實(shí)現(xiàn)虛函數(shù)的技術(shù)不盡相同,但基本都包含如下思想:程序運(yùn)行時(shí),編譯器為每個(gè)多態(tài)類創(chuàng)建一個(gè)虛函數(shù)表vtable,表中按虛函數(shù)的聲明順序保存每個(gè)虛函數(shù)運(yùn)行時(shí)在內(nèi)存中的地址;同時(shí)還自動(dòng)為該類增加一個(gè)指針類型的數(shù)據(jù)成員vptr,并讓vptr指向虛函數(shù)表首地址。當(dāng)用多態(tài)類定義的對象時(shí),對象將自動(dòng)有了一個(gè)指向虛函數(shù)表的指針成員vptr。如圖3所示。

        圖3 虛函數(shù)實(shí)現(xiàn)機(jī)制

        程序運(yùn)行時(shí),如果基類指針指向了這樣的派生類對象并且要調(diào)用某個(gè)虛函數(shù),就會(huì)通過派生類對象的vptr獲得派生類中同名的虛函數(shù)地址,從而執(zhí)行它,而不再理會(huì)基類中的該函數(shù)。僅當(dāng)派生類中沒有要調(diào)用的虛函數(shù),程序才轉(zhuǎn)去調(diào)用基類中的同名虛函數(shù),也就是說派生類中虛函數(shù)表和指針成員vptr是實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性關(guān)鍵所在。下面分兩種情況詳細(xì)討論Visual C++環(huán)境下虛函數(shù)的底層實(shí)現(xiàn)機(jī)制。

        3.1 單繼承下的動(dòng)態(tài)多態(tài)性實(shí)現(xiàn)機(jī)制

        假設(shè)存在如圖4所示繼承關(guān)系的兩個(gè)類,派生類沒有重寫基類的任何虛函數(shù),虛函數(shù)表中將按虛函數(shù)聲明順序存放其地址,派生類的虛函數(shù)表中父類的虛函數(shù)在排在前面,如圖5所示。

        圖4 單繼承關(guān)系下包含虛函數(shù)UML圖

        圖5 單繼承下虛函數(shù)實(shí)現(xiàn)機(jī)制

        修改Derived類的成員函數(shù)名f1為f,表示Derived類重寫基類的虛函數(shù)f(),在其虛函數(shù)表中重寫的f()函數(shù)的地址將覆蓋從基類繼承來的虛函數(shù)的地址,沒有被重寫的函數(shù)依舊,如圖6所示。當(dāng)用基類指針pb指向Derived類的對象,調(diào)用虛函數(shù)即執(zhí)行語句“pb→f();”時(shí),vptr會(huì)在派生類的虛函數(shù)表中查找對應(yīng)的函數(shù)的入口地址,調(diào)用對應(yīng)派生類對象的成員函數(shù)f(),實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。

        圖6 單繼承下的動(dòng)態(tài)多態(tài)性實(shí)現(xiàn)機(jī)制

        3.2 多繼承下的動(dòng)態(tài)多態(tài)性實(shí)現(xiàn)機(jī)制

        假設(shè)存在如圖7所示多繼承關(guān)系的三個(gè)類。Derived類重寫了基類的虛函數(shù)f()。如果派生類的多個(gè)基類含有虛函數(shù),編譯系統(tǒng)會(huì)為它創(chuàng)建多個(gè)虛函數(shù)表。虛函數(shù)表中各虛函數(shù)的順序與其基類中的一樣,派生類中新增的虛函數(shù)將按聲明順序被追加在第一個(gè)虛函數(shù)表中。如果多繼承關(guān)系中派生類重寫了基類的某個(gè)虛函數(shù),依然遵循覆蓋原則,即在其每個(gè)虛函數(shù)表中用重寫的虛函數(shù)的地址覆蓋從基類繼承來的同名虛函數(shù)的入口地址,如圖8所示。

        圖7 多繼承關(guān)系下包含虛函數(shù)UML圖

        圖8 多繼承下的動(dòng)態(tài)多態(tài)性實(shí)現(xiàn)機(jī)制

        4 結(jié)語

        多態(tài)性是OOP的有力工具。適當(dāng)利用多態(tài)性,可增加軟件系統(tǒng)的靈活性,減少冗余信息,提高軟件的可重用性和可擴(kuò)充性。本文對C++語言中動(dòng)態(tài)多態(tài)性的實(shí)現(xiàn)方法進(jìn)行了分析,并通過相關(guān)實(shí)例和內(nèi)存布局圖對其在單繼承和多繼承關(guān)系下的底層實(shí)現(xiàn)機(jī)制進(jìn)行了研究,給出了動(dòng)態(tài)多態(tài)性設(shè)計(jì)和實(shí)現(xiàn)的有效方法。

        [1]鄭莉,董淵,何江舟.C++語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2010,(7):306-340.

        [2]劉天印,李福亮.C++程序設(shè)計(jì)[M].北京:北京大學(xué)出版社,2006,(1):294-309.

        [3]董泉伶.關(guān)于C++動(dòng)態(tài)多態(tài)性實(shí)現(xiàn)機(jī)制的探究[J].現(xiàn)代計(jì)算機(jī),2009,(11):108-110.

        [4]趙紅超,方金云,唐志敏.C++的動(dòng)態(tài)多態(tài)和靜態(tài)多態(tài)[J].計(jì)算機(jī)工程,2005,(10):72-74.

        [5]宋新愛.基于容器的面向?qū)ο蠹夹g(shù)的多態(tài)性實(shí)現(xiàn)及應(yīng)用[J].西安石油大學(xué)學(xué)報(bào)(自然科學(xué)版),2009,(9):86-88.

        猜你喜歡
        基類多態(tài)指針
        分層多態(tài)加權(quán)k/n系統(tǒng)的可用性建模與設(shè)計(jì)優(yōu)化
        基于C#面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝、繼承和多態(tài)分析
        參差多態(tài)而功不唐捐
        偷指針的人
        為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
        空戰(zhàn)游戲設(shè)計(jì)實(shí)例
        一種基于用戶興趣的STC改進(jìn)算法
        虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》中的教學(xué)方法研究
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識別
        電測與儀表(2015年5期)2015-04-09 11:30:42
        人多巴胺D2基因啟動(dòng)子區(qū)—350A/G多態(tài)位點(diǎn)熒光素酶表達(dá)載體的構(gòu)建與鑒定及活性檢測
        黑人老外3p爽粗大免费看视频| 免费无遮挡毛片中文字幕| 一本久久a久久精品综合| 青青草视频在线观看网| 日本19禁啪啪吃奶大尺度| 亚洲成成品网站源码中国有限公司| 国产v精品成人免费视频400条| 97人妻中文字幕总站| 国产极品粉嫩福利姬萌白酱| 欧美巨大巨粗黑人性aaaaaa| 久久99精品久久久66| 日本一区二区视频免费在线观看| 一边摸一边抽搐一进一出口述 | 亚洲愉拍99热成人精品热久久| 亚洲精品夜夜夜| 亚洲人妻中文字幕在线视频| 日产一区日产2区日产| 好男人社区影院www| 正在播放一区| 日韩人妻有码中文字幕| 中国久久久一级特黄久久久| 中国老熟妇自拍hd发布| 香蕉国产人午夜视频在线观看| 熟女高潮av一区二区| 亚洲成a人v欧美综合天堂| 97影院在线午夜| 亚洲AV秘 无码一区二区在线| 男男亚洲av无一区二区三区久久| 久久精品国产亚洲av电影网| 国产午夜亚洲精品不卡福利| 亚洲不卡毛片在线观看| 亚洲av成人片色在线观看| 69久久夜色精品国产69| 亚洲第一区二区快射影院| 精品国产一区二区三区性色| www射我里面在线观看| 国产成人啪精品午夜网站| 亚洲av大片在线免费观看| 无码色av一二区在线播放| 97超级碰碰人妻中文字幕| 亚洲一区二区三区av色婷婷|