李欣然+趙山林
摘 要: C++語(yǔ)言程序設(shè)計(jì)課程中,多態(tài)性分為兩類。一是靜態(tài)多態(tài),通過(guò)函數(shù)重載實(shí)現(xiàn),解決自定義數(shù)據(jù)類型運(yùn)算問(wèn)題;二是動(dòng)態(tài)多態(tài),通過(guò)虛函數(shù)實(shí)現(xiàn),提高了程序的可擴(kuò)充性。通過(guò)實(shí)例分析出利用函數(shù)重載實(shí)現(xiàn)靜態(tài)多態(tài)的方法以及利用虛函數(shù)產(chǎn)生動(dòng)態(tài)多態(tài)的條件。
關(guān)鍵詞: C++語(yǔ)言程序設(shè)計(jì); 靜態(tài)多態(tài); 動(dòng)態(tài)多態(tài); 虛函數(shù)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2017)02-57-0
0 引言
多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特征。從系統(tǒng)實(shí)現(xiàn)的角度看,多態(tài)性分為兩類:靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性[1]。靜態(tài)多態(tài)性是通過(guò)函數(shù)重載實(shí)現(xiàn)的。由函數(shù)重載和運(yùn)算符重載形成的多態(tài)性屬于靜態(tài)多態(tài)性。動(dòng)態(tài)多態(tài)性是指編譯時(shí)不能確定調(diào)用的是哪個(gè)函數(shù),而在程序運(yùn)行過(guò)程中才動(dòng)態(tài)地確定具體操作對(duì)象。動(dòng)態(tài)多態(tài)又稱運(yùn)行時(shí)的多態(tài)性。
1 靜態(tài)多態(tài)性
靜態(tài)多態(tài)性是程序編譯時(shí)就知道調(diào)用函數(shù)的全部信息,因此,在程序編譯時(shí)系統(tǒng)就能決定要調(diào)用的是哪個(gè)函數(shù)。靜態(tài)多態(tài)性又稱編譯時(shí)的多態(tài)性。靜態(tài)多態(tài)性的函數(shù)調(diào)用速度快、效率高,但缺乏靈活性,在程序運(yùn)行前就已決定了執(zhí)行的函數(shù)和方法。下面介紹靜態(tài)多態(tài)的實(shí)現(xiàn)方法。
1.1 函數(shù)重載
C++允許用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)類型或者參數(shù)個(gè)數(shù)不同,這就是函數(shù)的重載。重載函數(shù)的參數(shù)個(gè)數(shù),參數(shù)類型,或參數(shù)順序三者中必須至少有一種不同,函數(shù)返回值類型可以相同也可以不同。下列程序的功能是利用函數(shù)重載求兩個(gè)整數(shù)或三個(gè)整數(shù)最大數(shù)。
函數(shù)重載以后,根據(jù)實(shí)參的類型及個(gè)數(shù)決定調(diào)用哪個(gè)重載的函數(shù)。上例中實(shí)參是兩個(gè)就調(diào)用求兩個(gè)數(shù)最大值函數(shù),同理實(shí)參是三個(gè)就調(diào)用求三個(gè)數(shù)最大值得函數(shù)。
當(dāng)幾個(gè)函數(shù)的功能是相同的或者相近的,只是參數(shù)類型或者參數(shù)個(gè)數(shù)不同,可以考慮定義函數(shù)重載。同一個(gè)函數(shù),通過(guò)重載可以實(shí)現(xiàn)不同的功能。
1.2 運(yùn)算符重載
運(yùn)算符重載也屬于函數(shù)重載,解決的是自定義數(shù)據(jù)類型的運(yùn)算問(wèn)題。運(yùn)算符重載既可以重載為類的成員函數(shù)也可以重載為類的友元函數(shù)。下列程序的功能是通過(guò)運(yùn)算符重載為類的成員函數(shù)完成復(fù)數(shù)的算術(shù)運(yùn)算。
C++中的運(yùn)算符只能對(duì)基本數(shù)據(jù)類型進(jìn)行運(yùn)算。復(fù)數(shù)是一種自定義數(shù)據(jù)類型,是不能用C++提供的運(yùn)算符完成算術(shù)運(yùn)算的。自定義數(shù)據(jù)類型--復(fù)數(shù)類只有通過(guò)運(yùn)算符重載才能利用C++已有的運(yùn)算符完成運(yùn)算。所以,運(yùn)算符重載解決的是自定義數(shù)據(jù)類型的運(yùn)算問(wèn)題。同理通過(guò)對(duì)流插入運(yùn)算符和流提取運(yùn)算符重載可以解決自定義數(shù)據(jù)類型的輸入輸出問(wèn)題。
2 動(dòng)態(tài)多態(tài)性
動(dòng)態(tài)多態(tài)性是指在編譯過(guò)程中不能確定調(diào)用的是哪個(gè)函數(shù),只有在程序運(yùn)行過(guò)程中才能確定調(diào)用具體函數(shù)的過(guò)程。它又稱運(yùn)行時(shí)的多態(tài)性。動(dòng)態(tài)多態(tài)性是通過(guò)虛函數(shù)( virtual function)實(shí)現(xiàn)的。面向?qū)ο髮?shí)現(xiàn)動(dòng)態(tài)多態(tài)應(yīng)滿足三個(gè)條件。首先,動(dòng)態(tài)關(guān)聯(lián)必須存在于類的繼承結(jié)構(gòu)中,也就是說(shuō)有基類有派生類。其次,基類中某一成員函數(shù)被定義為虛函數(shù),且該虛函數(shù)在派生類中有不同的實(shí)現(xiàn)。第三,利用指針或引用調(diào)用該虛函數(shù)才能產(chǎn)生動(dòng)態(tài)關(guān)聯(lián)。
下列程序的功能是通過(guò)虛函數(shù)完成動(dòng)態(tài)關(guān)聯(lián)。
上例中p1. Area()是通過(guò)對(duì)象名調(diào)用虛函數(shù)產(chǎn)生靜態(tài)關(guān)聯(lián),對(duì)象名調(diào)用的是自己所屬類的虛函數(shù)。fun(rect)調(diào)用的是派生類的Area()函數(shù),而fun(p1)調(diào)用的是基類的Area()函數(shù)。通過(guò)指針或引用調(diào)用虛函數(shù)才能產(chǎn)生動(dòng)態(tài)關(guān)聯(lián)。
3 結(jié)論
本文分析了《C++語(yǔ)言程序設(shè)計(jì)》課程中多態(tài)問(wèn)題。多態(tài)分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。通過(guò)實(shí)例分析出靜態(tài)多態(tài)的特點(diǎn)和作用,以及靜態(tài)多態(tài)的實(shí)現(xiàn)方法。通過(guò)實(shí)例分析出動(dòng)態(tài)多態(tài)的特征,以及實(shí)現(xiàn)動(dòng)態(tài)關(guān)聯(lián)的條件。幫助讀者理解面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的基本特征-----多態(tài)的含義和作用。
參考文獻(xiàn)(Reference):
[1] 譚浩強(qiáng).C++程序設(shè)計(jì)[M].清華大學(xué)出版社,2015.
[2] 鄭莉.C++語(yǔ)言程序設(shè)計(jì)(第4版)[M].清華大學(xué)出版社,2011.
[3] 錢能.C++程序設(shè)計(jì)教程設(shè)計(jì)思想與實(shí)現(xiàn)[M].清華大學(xué)出版
社,2009.
[4] 姚林.C++程序設(shè)計(jì)[M].人民郵電出版社,2011.