?

面向對象程序設計中多態性探討

2017-06-05 15:04劉變蓮
電腦知識與技術 2017年10期
關鍵詞:多態繼承靜態

劉變蓮

摘要:該文主要討論面向對象程序設計中的多態問題,其中包括:靜態和動態多態兩種。用例子解釋說明其中抽象的概念。

關鍵詞:多態;動態;靜態;繼承;封裝

中圖分類號:TP311

文獻標識碼:A

文章編號:1009-3044(2017)10-0060-02

1.面向對象程序設計的基本特性:封裝、繼承、多態

類是封裝的基本單位,使得創建類和使用類完全分開,保護類中數據的安全,同時又可以方便地使用別人創建的類。正如手機大家都會使用,就是建立在手機的制造者使用封裝機制,才使得大家都會用手機而不用關心手機的內部工作細節一樣;建立新類可以用繼承機制,從而有效利用已有類的代碼,提高開發效率。正如汽車的設計也利用繼承已有的汽車設計方案一樣,而不是搬倒重來,這樣太不合算了。多態性可以解決有層次關系的類之間繼承并擴展的問題,可以在一定程度上忽略類之間的區別,而以統一的方式使用它們的對象,從而在繼承的基礎上得以很好的擴展。同時也可以解決建立新類時,已有運算符使用問題,從而使原有運算符號適合新創建的類(新的數據類型)。下面重點討論多態。多態分成兩種:靜態多態和動態多態。

2.靜態多態

平時在學習時語法很好理解,但是難點在于實際編程時的靈活使用。

靜態多態也叫編譯時多態,也叫早綁定。即,函數名和函數代碼的對應問題在編譯階段就可以確定,函數重載和運算符重載都屬于靜態綁定的情況。

2.1函數重載

函數重載是指一個函數名對應多份函數定義代碼。這樣就可以選擇其一來執行。選擇的依據是:參數個數或參數類型的不同,根據實參和形參匹配的情況決定。下面舉例說明。

這個例子中的addo函數就是靜態多態的實例。在編譯階段編譯器是通過參數的不同選擇不同的重載版本,從而就可以確定addO函數名是調用(對應)哪一個版本的代碼,稱這種情況是早綁定,也就是在編譯階段函數名和函數代碼完成了綁定。

下面再舉一個復數的例子,了解運算符重載的情況。

2.2運算符重載

每一種計算機編程語言都包含了許多運算操作符號。但是這些運算符只適用于基本類型的數據。新定義的類,屬于新數據類型,也可以同基本數據類型一樣完成加、減、乘、除等常見的運算。條件是在新定義類的內部添加運算符重載函數。其中的運算符重載函數有兩種形式:類的成員函數和類的友元函數。

一個新定義的復數類,也可以完成兩個復數的加法和減法,同時復數對象也可以整體輸入和輸出。

只要在定義復數類時,在其中增加運算符重載函數即可。

下面的程序功能是:定義復數類,其中有加法和減法的2

3.動態多態一虛函數

上面說明了靜態多態的情況,下面說明動態多態。

動態多態是指程序運行時,根據指針指向對象的不同,從而調用不同層次(有繼承關系)對象的同名函數。保證基類和派生類之間同名函數用統一的調用形式訪問,從而方便擴展。C++語言是用虛函數實現動態多態的。

虛函數是實現動態多態的基礎,原因是只要函數被聲明為虛函數了,編譯器就會形成類對應的虛函數表。其中的虛函數表中存儲了每一個類中虛函數的地址,同時,包含虛函數的類對象內存中也存儲了指向虛函數表的指針,從而在程序運行時,可以正確找到相應虛函數的地址,以便正確調用它。但是要求用基類指針或基類引用指向基類對象或派生類對象,同時要保證基類中的虛函數和派生類的虛函數,函數原型必須一致才行。下面舉例說明。

這些是使用虛函數的條件。即定義基類指針變量,它可以指向派生類對象,也可以指向基類對象,同時,基類的虛函數和派生類的虛函數必須保持原型一致,這樣才能保證在編譯時,編譯器為包含虛函數的類生成虛函數表,從而才能保證程序運行時,指針指向不同對象來調用不同類對象中的虛函數。如下是該程序的相應虛函數表及對象的內存結構圖。

編譯程序時,編譯器為虛函數的調用建立了虛函數表,及對象的內存中存儲了指向虛函數表的指針,才能為后期程序運行時順利找到對應虛函數做了前期準備,才能完成動態多態。

綜上所述,面向對象編程的三大特性是:封裝、繼承和多態。封裝能保證數據的安全,同時使創建類和使用類分離。繼承是復用類代碼,同時多態使復用基類代碼的同時可以改造基類的代碼,并且還可以保持基類和派生類對象使用接口的一致性,為擴展提供了方便。

猜你喜歡
多態繼承靜態
分層多態加權k/n系統的可用性建模與設計優化
最新進展!中老鐵路開始靜態驗收
參差多態而功不唐捐
猜猜他是誰
淺談杜審言、杜甫的祖孫關系:推崇、繼承、發展
具7μA靜態電流的2A、70V SEPIC/升壓型DC/DC轉換器
50t轉爐靜態控制模型開發及生產實踐
煙堿型乙酰膽堿受體基因多態與早發性精神分裂癥的關聯研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合