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