C 學習 多型性與虛函式

2021-08-24 20:39:41 字數 2695 閱讀 5850

概念:向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為(即方法)。

作用:可以實現乙個介面,多種方法

應用:多型性分為靜態多型性和動態多型性,靜態多型性即編譯時的多型性,通過函式過載實現;動態多型性是執行時才確定操作所作用的物件,動態多型性通過虛函式(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 通過虛函式實現多型性...