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