C 的多型性

2021-04-13 05:45:44 字數 2766 閱讀 8588

c++的多型性

1.多型性的概念

多型性是指用乙個名字定義不同的函式,這函式執行不同但又類似的操作,從而實現「乙個介面,多種方法」。

多型性的實現與靜態聯編、動態聯編有關。靜態聯編支援的多型性稱為編譯時的多型性,也稱靜態多型性,它是通過函式過載和運算子過載實現的。動態聯編支援的多型性稱為執行時的多型性,也稱動態多型性,它是通過繼承和虛函式實現的。

c++的多型性

2.函式過載

函式過載的意義在於他能用同乙個名字訪問一組相關的函式。

在類中普通成員函式和建構函式都可以過載,特別是建構函式的過載(他提供了多種初使化方式)給使用者更大的靈活性。

在基類和派生類的函式過載有兩種情況:一種是引數有所差別的過載。另一種是引數沒有差別的過載,只是他們屬於不同的類。

可以用以下兩種方法來區分這兩種函式:用物件名加以區分;使用「類名::」加以區分。

3.運算子過載稱動態多型性,他是通過繼承和虛函式實現的。

運算子過載通過建立運算子函式operator@()來實現。運算子函式定義了過載的運算子將要進行的操作,這種操作通常作用在乙個類上。這樣,在編譯時遇到名為operator@的運算子函式(@表示所要過載的運算子),就檢查傳遞給函式的引數的型別。

過載運算子與預定義運算子的使用方法完全相同,它不能改變原有運算子的引數個數(單目或雙目),也不能改變原有的優先順序的結合性。使用者不能定義新的運算子,只能從c++已有的運算子中選擇乙個恰當的運算子過載。

3.1成員運算子函式

運算子函式可以定義為它將要操作的類的成員(稱為成員運算子函式),也可以定義為非類的成員,但是非成員的運算子函式大多是類的友元函式(稱為友元運算子函式)。

成員運算子函式在類中的宣告格式為:

class x;

其中type為函式的返回型別,@為所要過載的運算子符號,x是過載此運算子的類名,參數列中羅列的是該運算子所需要的運算元。

成員運算子函式定義的形式一般為:

type x::operator@(參數列)

//函式體}

其符號的含義與宣告時相同。

在成員運算子函式的參數列中,若運算子是單目的,則參數列為空,此時當前物件作為運算子的乙個運算元,通過this指標隱含地傳遞給函式的;若運算子是雙目的,則參數列中有乙個運算元,它作為運算子的右操作引數,此時當前物件做為運算子的左運算元,它是this指標隱含地傳遞給函式的。總之成員運算子函式operator@所需要的乙個運算元是由物件通過this指標隱含傳遞。

3.2友元運算子函式

在c++中可以把運算子函式定義成某個類的友元函式,稱為友元運算子函式。

友元運算子函式在類的內部宣告格式如下:

friend type operator@(參數列)

定義友元運算子函式格式如下:

type operator@(參數列)

與成員運算子函式不同,友元運算子函式是不屬於任何類物件的,它沒有this指標。若過載的是雙目運算子,則參數列中有兩個運算元;若過載的是單目運算子,則參數列中只有乙個運算元。 不能用友元函式過載的運算子是=、()、、-〉,其餘的運算子都可以使用友元函式來實現過載。

運算子函式呼叫形式如下表:

運算子函式呼叫形式

習慣形式 友元運算子函式呼叫形式 成員運算子函式呼叫形式

a+b operator(a,b) a.operator+(b)

-a operator-(a) a.operator-()

a++ operator++(a,0) a.operator++(0)

4.賦值運算子

繼承c語言,使用者自定義的類和結構都要能進行賦值運算。而陣列名不能賦值,陣列名實質上是乙個常量指標。

對於任何類,c++提供了預設的賦值運算子。一般地,預設的賦值運算子過載是能夠勝任工作的。當類中有指標型別時,需要自定義賦值運算子函式。一般其函式體包含兩部分:

1)與析構函式類似,取消物件已經占有的資源;2)與建構函式類似,諂渲蟹峙湫碌淖試礎?br> 類的賦值運算子過載「=」只能過載為成員函式,不能過載為友元函式。

過載後的運算子函式operator=()不能被繼承。

拷貝建構函式和賦值運算子過載的區別:宣告和定義方式不同;呼叫方式不同。

5.虛函式

虛函式是過載的另一種表現形式,允許虛函式呼叫與函式體之間的聯絡在執行時才建立。

定義:虛函式就是在基類中被關鍵字virtual說明,並在派生類中重新定義的函式,在派生類中重新定義時,其函式原形包括返回型別,函式名,引數個數與引數型別的順序,都必須與基類中的原形必須相同。

建構函式不能是虛函式,但析構函式可以是虛函式。

虛函式與過載函式的關係:當普通的函式過載時,其函式的引數或引數型別必須有所不同,函式的返回型別也可不同;在派生類中,重新定義虛函式時要求函式名、返回型別、引數個數、引數的型別和順序與基類中的函式原形完全相同;若僅僅返回型別不同,其餘均相同,系統會給出錯誤資訊。虛函式過載時若僅僅函式名相同,而引數的個數、型別或順序不同系統將它作為普遍函式過載,虛函式的特徵將會丟失。

多重繼承與虛函式:多重繼承可視為多個單繼承的組合。

6.純虛函式和抽象類

純虛函式:是乙個在基類中說明的虛函式,他在該基類中沒有定義,但要求在它的派生類中定義自己的版本,或重新說明為純虛函式。

純虛函式的一般形式:virtual type func_name(參數列)=0(type是函式的返回型別,func_name是函式名)。

抽象類:乙個類至少有乙個純虛函式的類。抽象類提供了處理各種不同派生類的統一介面,將實現的責任交給了派生類。

C 的多型性

type text css rel stylesheet href 是允許將父物件設定成為和乙個或多個它的子物件相等的技術,比如parent child 多型性使得能夠利用同一類 基類 型別的指標來引用不同類的物件,以及根據所引用物件的不同,以不同的方式執行相同的操作.c 中多型更容易理解的概念為允...

C 的多型性

c 的多型性分為兩種,一是執行時的多型性,二是編譯時的多型性,這裡我就不多介紹了。才是做好的說明,在 中有注釋以及我的理解。不知道自己這樣解釋是否正確。如下 執行時的多型性 include using namespace std 執行時的多型性是指直到系統執行時,才根據實際情況決定實現何種操作,執行...

C 的多型性

c 支援兩種多型性 編譯時,表現為函式名或操作符的過載 執行時,表現為派生類和虛函式來實現。其中虛函式被宣告為virtual,又分為兩種 1.後面沒有 0同時提供了預設實現,沒有預設實現的子類繼承這個實現 2.後面有 0的是純虛函式,至少有乙個純虛函式的就是抽象類,抽象類不能被例項化。我見到的一種用...