c 中的多型學習總結

2021-09-29 17:26:03 字數 4061 閱讀 6106

c#的多台方法,大體上和c++的類似,但是有點區別的,我這裡剛剛初學,因此把重點記錄下。

多型是同乙個行為具有多個不同表現形式或形態的能力。

多型性意味著有多重形式。在物件導向程式設計正規化中,多型性往往表現為"乙個介面,多個功能"。

多型性可以是靜態的或動態的。在靜態多型性中,函式的響應是在編譯時發生的。在動態多型性中,函式的響應是在執行時發生的。

在c#中,每個型別都是多型的,因為包括使用者定義型別在內的所有型別都繼承自object。

using system;

class rectangle:  shape    //繼承shape抽象類

//public int area() //編譯錯誤

public override int area ()        //重新做派生類中實現area方法,但要是用override「重寫」,否則編譯錯誤

}class rectangletester

",a);

console.readkey();}}

}

2.2虛方法之virtual

當有乙個定義在類中的函式需要在繼承類中實現時,可以使用虛方法。虛方法是使用關鍵字 virtual宣告的。虛方法可以在不同的繼承類中有不同的實現。對虛方法的呼叫是在執行時發生的。

c#的動態多型性是通過 抽象類 和 虛方法 實現的。

以下例項建立了 shape 基類,並建立派生類 circle、 rectangle、********, shape 類提供乙個名為 draw 的虛擬方法,在每個派生類中重寫該方法以繪製該類的指定形狀。

虛方法的例項如下:

#define ov      //巨集定義一定要放在using前面

/*如果注釋掉上面的巨集定義,那麼程式輸出的結果是:

執行基類的畫圖任務

執行基類的畫圖任務

執行基類的畫圖任務

說明,使用new的方法是錯誤的,與設想的功能偏離了。

* 說白了,子類呼叫draw()的使用是呼叫了基類的draw().並沒有實現多型的功能

如果使用上面的巨集定義

輸出是畫乙個長方形

執行基類的畫圖任務

畫乙個三角形

執行基類的畫圖任務

畫乙個圓形

執行基類的畫圖任務

請按任意鍵繼續. . .

這樣就實現了多型。

*  * 這裡強調一次:

* 在子類中用 override 重寫父類中用 virtual 申明的虛方法時,

* 例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法;

如果在子類中用 new 覆蓋父類中用 virtual 申明的虛方法時,

* 例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法

*  *  override是重寫,即將基類的方法在派生類裡直接抹去重新寫,故而呼叫的方法就是子類方法;

*  而new只是將基類的方法在派生類裡隱藏起來,故而呼叫的仍舊是基類方法。

*/using system;

using system.collections.generic;

public class shape

//public int y

//public int height

//public int width

// 虛方法

public virtual void draw()

}class circle : shape

}class rectangle : shape

}class ******** : shape

}class program

;        // 使用 foreach 迴圈對該列表的派生類進行迴圈訪問,並對其中的每個 shape 物件呼叫 draw 方法 

foreach (var shape in shapes)

"按下任意鍵退出。");

}}

在來乙個例項:

using system;

using system.collections.generic;

using system.linq;

using system.text;

class rectangle : shape     //繼承抽象類

public override int area()  //重寫抽象類的方法

}class ******** : shape      //繼承抽象類

public override int area()  //重寫抽象類的方法

}class rectangletester

, 三角形面積:", a, b);}}

}

/*執行結果:

計算長方形類的面積:

計算三角形類的面積:

長方形面積: 70, 三角形面積:35

請按任意鍵繼續. . .

*/3、總結:

c# 多型性

3.1、多型:乙個介面多個功能。

靜態多型性:編譯時發生函式響應(呼叫);

動態多型性:執行時發生函式響應。

靜態繫結(早期繫結):編譯時函式和物件的連線機制。兩種技術實現靜態多型性:函式過載/運算子過載。

3.2、函式過載:在同一範圍內對相同函式名有多個定義,可以是引數型別或引數個數的不同,但不許只有返回值型別不同。

運算子過載,這個後續在討論。

3.3、關鍵字 abstract 宣告抽象類:用於介面部分類的實現(派生類繼承抽象類時,實現完成)。抽象類包含抽象方法,抽象方法可被派生類實現。

抽象類規則:

1.不能建立抽象類的例項

2.不能在抽象類外定義抽象方法

3.不能把抽象類宣告為sealed(類前帶關鍵字sealed代表該類是密封類,不能被繼承)

4.關鍵字virtual宣告虛方法:用於方法在繼承類中的實現(在不同的繼承類中有不同的實現)。虛方法也可以被直接呼叫。

抽象類和虛方法共同實現動態多型性。

注:繼承類中的重寫虛函式需要宣告關鍵字 override,在方法引數傳入中寫(類名 形參名)例如 public void callarea(shape sh),意思是傳入乙個 shape 型別的類。

3.4、virtual 和 abstract區別

virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。

1.virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。

2.virtual可以被子類重寫,而abstract必須被子類重寫。

3.如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。

4.無法建立abstract類的例項,只能被繼承無法例項化。

5.虛方法也可以被直接呼叫

3.5、過載和重寫區別

過載(overload)是提供了一種機制,相同函式名通過不同的返回值型別以及引數來表來區分的機制。過載在同乙個作用域(一般指乙個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以):

a.方法名必須相同

b.引數列表必須不相同

c.返回值型別可以不相同

重寫(override)是用於重寫基類的虛方法,這樣在派生類中提供乙個新的方法。

子類中為滿足自己的需要來重複定義某個方法的不同實現,需要用 override 關鍵字,被重寫的方法必須是虛方法,用的是 virtual 關鍵字。它的特點是(三個相同):

相同的方法名

相同的引數列表

相同的返回值

3.6、抽象方法和虛方法的區別

1.虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。這個是特別需要注意的!

2.抽象方法只能在抽象類中宣告,虛方法不是。如果類包含抽象方法,那麼該類也是抽象的,也必須宣告類是抽象的。這一點好c++是一樣的。

3.抽象方法必須在派生類中重寫,這一點和介面類似,虛方法不需要再派生類中重寫。簡單說,抽象方法是需要子類去實現的。虛方法是已經實現了的,可以被子類覆蓋,也可以不覆蓋,取決於需求。

抽象方法和虛方法都可以供派生類重寫。

多型學習總結

一.多型性的概念 二.虛函式 class 類名 virtual 返回型別 函式名 形式引數列表 虛函式 includeusing namespace std class point 表示平面上的點 virtual double area 虛函式 class circle public point 圓...

C 學習筆記之多型 多型的學習 多型學習

c 學習筆記之多型 多型的學習 多型學習 多型分為兩類 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 動態多型...

c 多型總結

多型 多型可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。接下來,我寫乙個簡單地函式來說明多型 includeusing namespace std int add int left,int right float add float left...