999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

OOP C++中的動態多態性及其底層實現機制研究

2014-10-13 08:26:00馬瑞敏
長治學院學報 2014年2期

馬瑞敏

(長治學院 計算機系,山西 長治 046011)

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

1 多態的類型

多態從實現的角度來講可以劃分為兩類:編譯時多態和運行時多態。前者是在編譯時確定了同名操作的具體操作對象,又稱靜態多態,函數及運算符的重載、數據類型強制轉換和模板都屬于靜態多態;后者是在程序運行過程中才能動態地確定操作所針對的具體對象,又稱動態多態。總體上說,動態多態才是真正的多態性。

2 動態多態性的實現

下面根據程序Pro1.cpp來分析動態多態性的實現。

圖1 未實現動態多態性的運行結果

圖2 實現動態多態性的運行結果

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

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

C++規定:若在派生類中重寫了基類的虛函數,即使不添加virtual關鍵字,它們也自動成為了虛函數。關鍵字virtual指示C++編譯器對調用虛函數進行動態聯編。上述條件③中對虛函數的調用也有約定:只能使用指針或引用調用虛函數,不能使用對象名調用。因為使用對象名調用函數時,函數調用與函數的實現在編譯階段已經確定,無法實現動態綁定,而指針或引用在程序運行過程中可能會指向同一基類的不同派生類對象,因此使得通過指針或引用調用虛函數時,對應的函數實現代碼需要在程序運行過程中才能夠進行綁定,從而實現動態多態性。一個聲明或繼承了虛函數的類稱為多態類。

3 動態多態性底層實現機制研究

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

圖3 虛函數實現機制

程序運行時,如果基類指針指向了這樣的派生類對象并且要調用某個虛函數,就會通過派生類對象的vptr獲得派生類中同名的虛函數地址,從而執行它,而不再理會基類中的該函數。僅當派生類中沒有要調用的虛函數,程序才轉去調用基類中的同名虛函數,也就是說派生類中虛函數表和指針成員vptr是實現運行時的多態性關鍵所在。下面分兩種情況詳細討論Visual C++環境下虛函數的底層實現機制。

3.1 單繼承下的動態多態性實現機制

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

圖4 單繼承關系下包含虛函數UML圖

圖5 單繼承下虛函數實現機制

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

圖6 單繼承下的動態多態性實現機制

3.2 多繼承下的動態多態性實現機制

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

圖7 多繼承關系下包含虛函數UML圖

圖8 多繼承下的動態多態性實現機制

4 結語

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

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

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

[3]董泉伶.關于C++動態多態性實現機制的探究[J].現代計算機,2009,(11):108-110.

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

[5]宋新愛.基于容器的面向對象技術的多態性實現及應用[J].西安石油大學學報(自然科學版),2009,(9):86-88.

主站蜘蛛池模板: 国产精品露脸视频| 免费无遮挡AV| 欧美日韩在线观看一区二区三区| 亚洲欧美人成电影在线观看| 成人毛片免费在线观看| 91国内外精品自在线播放| 18禁影院亚洲专区| 亚洲一区二区无码视频| 国产超薄肉色丝袜网站| 小蝌蚪亚洲精品国产| 国产精品内射视频| 熟女成人国产精品视频| 波多野衣结在线精品二区| 国产偷国产偷在线高清| 成人一级黄色毛片| 亚洲天堂视频网| www.亚洲国产| 国产另类视频| 米奇精品一区二区三区| a级毛片视频免费观看| 亚洲国产亚洲综合在线尤物| 亚洲日韩精品综合在线一区二区| 欧美色亚洲| 亚洲精品视频免费看| 99精品国产高清一区二区| jizz亚洲高清在线观看| 日韩欧美中文| 国产va视频| 亚洲av无码人妻| 久久无码av三级| 国产三级精品三级在线观看| 亚洲人成网站色7799在线播放 | 婷婷久久综合九色综合88| 亚洲精品手机在线| 真人免费一级毛片一区二区| 国产免费网址| 午夜老司机永久免费看片| 欧美午夜久久| 欧美第九页| 青青青国产视频手机| 在线观看亚洲天堂| 亚洲国产天堂久久综合226114| 中文字幕久久亚洲一区| 成人久久精品一区二区三区| 在线日本国产成人免费的| 成人久久精品一区二区三区 | 国产成人免费高清AⅤ| 天堂成人在线视频| 玩两个丰满老熟女久久网| 综合久久久久久久综合网| 欧美一区二区人人喊爽| 欧美亚洲欧美区| 国产免费怡红院视频| 99视频只有精品| 精品无码国产一区二区三区AV| 久久久91人妻无码精品蜜桃HD | 国产地址二永久伊甸园| 亚洲日韩每日更新| 久久人妻xunleige无码| 国产精品美女在线| 精品福利视频导航| 国产福利免费在线观看| 国产aaaaa一级毛片| 97视频精品全国免费观看| 国产办公室秘书无码精品| 亚洲视频影院| 午夜视频免费试看| 啊嗯不日本网站| 亚洲男人的天堂在线| 国产美女叼嘿视频免费看| 日韩成人午夜| 国产成人免费观看在线视频| 四虎精品国产AV二区| 久热99这里只有精品视频6| 午夜日b视频| 免费在线一区| 欧美日韩免费在线视频| 国产精选小视频在线观看| 国产日韩精品欧美一区喷| 精品久久久久成人码免费动漫 | 色九九视频| 国产精品视频第一专区|