概念:向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為(即方法)。
作用:可以實現乙個介面,多種方法
應用:多型性分為靜態多型性和動態多型性,靜態多型性即編譯時的多型性,通過函式過載實現;動態多型性是執行時才確定操作所作用的物件,動態多型性通過虛函式(virtual function)實現;
例子:
建立乙個point(點)類,包含資料成員x,y(座標點)。以它為基類,派生出乙個circle(圓)類,增加資料成員r(半徑),再以circle類為直接基類,派生出乙個cylinder(圓柱體)類,再增加資料成員h(高)。要求編寫程式,過載運算子「<<」和「>>」,使之能用於輸出以上類物件。
對於乙個比較大的程式,應當分成若干步驟進行。先宣告基類,再宣告派生類,逐級進行,分步除錯。
//首先實現基類point
#include
using
namespace
std;
class point
float gety() const
friend ostream & operator
<<(ostream &, const point &);
protected:
float x, y;
};void point::setpoint(float a, float b)
point::point(float a, float b)
ostream & operator
<<(ostream & output, const point & p)
int main()
//輸出結果
x=3.5
y=6.4
pnew = [1.1,3.2]
//宣告派生類circle
//派生類
class circle:public point
;//定義建構函式,對圓心座標和半徑初始化
circle::circle(float a, float b, float r):point(a,b),radius(r)
void circle::setradius(float r)
float circle::getradius() const
ostream & operator
<<(ostream & output, const circle & c)
float circle::area() const
將int main(){}更改為:
int main()
//執行結果
x=3.5 y=6.4
pnew = [1.1,3.2]
origina circle:2.5, y = 6.4, r = 4.3, area = 58.088
new circle:center = [2,2], r = 7, area = 153.938
pref:[2,2]
接下來再從派生類circle派生出cylinder類
//cylinder類
//增加高度屬性
//宣告circle的派生類cylinder
class cylinder:public circle
;cylinder::cylinder(float a, float b, float r, float h)
:circle(a, b, r),height(h)
void cylinder::setheight(float h)
float cylinder::getheight() const
float cylinder::volume() const
//過載運算子 <<
ostream & operator
<<(ostream & output, const cylinder & cy)
將int main(){}更改為:
int main()
輸出:
x=3.5 y=6.4
p-new = [1.1,3.2]
origina circle:x = 2.5, y = 6.4, r = 4.3, area = 58.088
new circle:center = [2,2], r = 7, area = 153.938
pref:[2,2]
original cylinder:x = 3.2, y = 7.6, r = 7.5, h = 4.3
new cylinder:center = [11], r = 3, h = 6.5
area = 28.2743, volume = 183.783
[1,1]
center = [1,1], r = 3, area = 28.2743
上例的靜態多型性是運算子過載引起的。可以看到,在編譯時編譯系統即可以判定應呼叫哪個過載運算子函式。稍後將在此基礎上討論動態多型性問題。
動態多型性通過虛函式實現:
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
C 多型性與虛函式
物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...
C 多型性 與 虛函式
1.運算子過載 運算子過載形式 1 過載為類的成員函式 運算子過載函式說明為類的成員函式的格式為 類名 operator 運算子 參數列 如 c1 c2 編譯器將給出的解釋為 c1.operator c2 該運算子過載函式僅僅有乙個引數,所以過載為成員函式時,雙目運算子僅有乙個引數。對於單目運算子,...
C 多型性與虛函式
多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。在c 中有兩種多型性 1 定義格式 虛函式是乙個類的成員函式,定義格式如下 virtual 返回型別 函式名 參數列 說明 2 通過虛函式實現多型性...