C 與C 中包含多型性分析

2021-05-05 12:09:55 字數 3273 閱讀 9278

與c#中包含多型性分析

包含多型性是指通過繼承提供多型性。 包含多型性反映了能夠在多於乙個類的物件中完成同一事物的能力

——用同一種方法在不同的類中處理不同的物件。例如,

customer

和vendor

物件都有乙個

name

屬性,則我們可以寫乙個事物來呼叫

name

屬性而不管我們所使用的是

customer

物件還是

vendor

物件,這就是包含多型性。包含多型性是執行時多型。

c#和c++

都通過繼承來為我們提供包含多型性。它們均提供了

virtual

關鍵字用於定義乙個支援多型的方法。子類對於虛擬方法可以自由地提供它自己的實現,這稱為重寫。下面是一些關於

c#虛擬方法的要點:

(1)如果方法是非虛擬的,編譯器簡單地使用所引用的型別來呼叫適當的方法。

(2)如果方法是虛擬的,編譯器將產生**來在執行時檢查所引用的類,來從適當的型別中呼叫適當的方法。

(3)當乙個虛擬方法被呼叫時,執行時會進行檢查(方法遲繫結)來確定物件和呼叫適當的方法,所有這些都是在執行時進行的。

對於非虛擬方法,這些資訊在編譯期間都是無效的,因此不會引起執行時檢查,所以呼叫非虛擬方法的效率會略微高一些。但在很多時候虛擬方法的行為會更有用,損失的那些效能所換來的功能是很值得的。在

c++和

c#中包含多型性是很類似的,他們均是通過虛函式來實現的。通過下面的**來分析它們間的異同。

c++源**

#include

using namespace std;

class drawingbase

};class line:public drawingbase

};class circle:public drawingbase

};class square:public drawingbase

};void main()

程式執行結果:

i'm a line !

i'm a circle !

i'm a square !

i'm just a generic drawing object!

請按任意鍵繼續

. . .

上面程式演示了多型性的實現(程式實現的說明將在下面的

c#源**後進行)。程式中類

line

、circle

和square

屬於同乙個類族,而且是通過公有派生而來。基類

drawingbase

的函式成員

draw

宣告為虛函式,程式中使用物件指標來訪問函式成員,這樣的聯編過程就是在執行中完成,實現了執行中的多型。通過基類型別的指標就可以訪問到正在指向的物件的成員,這使得能夠對同一類族中的物件進行統一的處理,抽象程度更高、程式更加簡潔、更加高效。在源程式中的第

a行,派生類

square

並沒有顯式給出虛函式宣告,這時系統就會遵循以下的規則來判斷乙個函式成員是不是虛函式:

(1)該函式是否與基類的虛函式有相同的名稱;

(2)該函式是否與基類的虛函式有相同的引數個數以及相同的對應引數型別;

(3)該函式是否與基類的虛函式有相同的返回值或者滿足賦值相容規則的指標、引用型的返回值;

如果從名稱、引數以及返回值三個方面檢查以後,派生類的函式滿足以上的條件,就被自動確定為虛函式。 c#

源**

using

system;

namespace

duotai3 }

public

class line : drawingbase }

public

class circle : drawingbase }

public

class square : drawingbase }

public

class drawdemo }

}程式執行結果:

i'm a line !

i'm a circle !

i'm a square !

i'm just a generic drawing object!

上面程式演示了多型性的實現。在

drawdemo

類中的main( )

方法中,建立了乙個陣列,陣列元素是

drawingbase

類的物件。該陣列名為

dobj

,是由四個

drawingbase

型別的物件組成。接下來,初始化

dobj

陣列,由於

line

,circle

和square

類都是drawingbase

類的派生類,所以這些類可以作為

dobj

陣列元素的型別。如果

c#沒有這種功能,你得為每個類建立乙個陣列。繼承的性質可以讓派生物件當作基類成員一樣用,這樣就節省了程式設計工作量。

一旦陣列初始化之後,接著是執行

foreach

迴圈,尋找陣列中的每個元素。在每次迴圈中,

dobj

陣列的每個元素(物件)呼叫其

draw( )

方法。多型性體現在:在執行時,各自呼叫每個物件的

draw( )

方法。儘管

dobj

陣列中的引用物件型別是

drawingbase

,這並不影響派生類過載

drawingbase

類的虛方法

draw( )。在

dobj

陣列中,通過指向

drawingbase

基類的指標來呼叫派生類中的過載的

draw( )

方法。

在drawdemo

程式中,呼叫了每個派生類的過載的

draw( )

方法。最後一行中,執行的是

drawingbase

類的虛方法

draw( )

。這是因為執行到最後,陣列的第四個元素是

drawingbase

類的物件。

注意在實現類的包含多型性用虛函式實現的時候

,c++與c#

有乙個非常重要的區別:正如我前面所說,在

c++中可以在派生類中省略掉

virtual

虛函式關鍵字,但是在

c#中必須在派生類中虛函式使用

override

關鍵字,否則編譯器不會把他當成虛函式,該派生類也不會具有多型性。

C 繼承與多型性

編寫乙個人員資訊管理系統。這個系統的功能是 互動式的實現校園人員資訊的錄入與顯示。分析 學校裡,主要有四類人員 大學本科學生 教師 研究生和助教。大學本科生每週有固定的學時數。教師除了固定的學時數外,還有每週的教學時數。研究生除了固定的學時數外,每週還可以自由做一定的研究。助教生除了上課外,還要做研...

C 中的多型性

首先理解一下什麼叫多型。同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。多型性通過派生類覆寫基類中的虛函式型方法來實現。多型性分為兩種,一種是編譯時的多型性,一種是執行時的多型性。編譯時的多型性 編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳...

C 中的多型性

多型 polymorphism 在c 中可以簡單地概括為 通用乙個介面,實現多種方法 它是物件導向程式設計領域的核心概念,只有程式在執行時才決定呼叫對應的函式。c 多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法稱為覆蓋 override 或者稱為重寫。重寫的話可...