C C 學習總結(五) 多型性

2021-09-05 11:15:24 字數 2219 閱讀 9585

多型:一種行為對應著多種不同的實現。根據c++實現多型的不同階段,多型的實現分為靜態聯編和動態聯編。

靜態聯編:在程式編譯階段就能實現的多型性,這種多型性成為靜態多型性(編譯時的多型性),可通過函式過載和運算子過載實現(運算子過載是一種特殊的函式過載);

動態聯編:在程式執行階段實現的多型性,這種多型性稱為動態多型性(執行時的多型性),可通過繼承、虛函式、基類的指標或引用等技術來實現。

(1)靜態多型性(函式過載)

在同一類中的同名成員函式(不限於同類成員函式,可以是任意過載函式),定義時在形式引數的個數、順序、型別方面有所不同,在程式編譯時就能根據實際引數與形式引數的匹配情況,確定該類物件究竟呼叫了哪乙個成員函式;

(2)動態多型性

在基類與派生類中存在的同名函式,要求該同名函式的原型在基類和派生類中完全一致,而且是虛函式。在編譯時無法確定究竟呼叫的是哪乙個同名函式,只有在程式執行時通過基類指標指向基類或派生類物件,或基類的引用代表的是基類或派生類的物件,確定呼叫的是基類還是派生類的同名函式。

靜態多型性的優點:函式呼叫速度快、效率高;

靜態多型性的缺點:程式設計不夠靈活。

靜態多型性可以通過函式過載和運算子過載來實現,前面已經涉及了普通函式過載,這裡講解運算子過載。

運算子過載是對已有的運算子賦予多重含義,c++中預定義的運算子的操作物件只能是基本資料型別,而對於使用者自定義型別也許要有類似的運算操作,這時就可以對運算子重新定義,賦予已有運算子新的功能。

運算子過載實質就是函式過載,此時的函式名為:operator 運算子,實際呼叫時,首先把指定的運算子表示式轉化為對運算子函式的呼叫,運算物件轉化為運算子函式的實際引數,然後根據實際引數的型別來確定究竟呼叫哪乙個同名運算子函式,這個過程是在編譯過程中完成的,因此運算子過載實現的時靜態多型性。

1、運算子過載的規則

運算子過載通常作用在乙個類上,這樣,該類的物件就可以使用這些運算子實現相應操作(如自定義的複數類)。

另外,可以被過載的運算子中,除了賦值運算子「=」以及變形的賦值運算子(如「+=」,「>>=」等)之外,其餘在基類過載的運算子都能被派生類繼承。

注意:①只能過載已有的運算子,不能創造新的運算子;

②過載之後,運算子的優先順序與結合性都不會改變

③運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造,一般來講過載的功能應該與原有的功能類似;

④過載運算子不能改變原運算子的操作物件個數,同時至少要有乙個物件是自定義的型別。

作用在類上的運算子過載可以有兩種方式:通過類中成員函式類的友元函式進行過載。

2、用成員函式過載運算子

成員函式過載運算子:將運算子過載定義成乙個類的成員函式的形式。

只能過載為成員函式的運算子:「=」、「()」、「」、「->」,另外單目運算子以及復合賦值運算子也建議過載為成員函式。

用成員函式過載運算子的一般格式:

《函式型別》 operator 《運算子》 (《形式參數列》)

其中「operator 《運算子》」可以理解為函式名。過載單目運算子時,形參列表為空,唯一的運算元為當前物件過載雙目運算子時,由形式參數列指定第二運算元(右運算元),第一運算元無需指定,呼叫運算子函式的當前物件就是第一運算元。

(1)過載單目運算子

《函式型別》 operator 《運算子》 ()

物件1=物件2 《運算子》  <———————等價於——————>物件1=物件2.operator 《運算子》 ()

如:a1=a2++ <———————等價於——————>a1=a2.operator ++()

(2)過載雙目運算子

《函式型別》 operator 《運算子》 (第二運算元形式引數)

物件1=物件2 《運算子》 物件3  <———————等價於——————>物件1=物件2.operator 《運算子》 (物件3)

如:a1=a2+a3 <———————等價於——————>a1=a2.operator ++(a3)

上例中,a1=a2++和a1=a2+a3都稱為隱式呼叫,而a1=a2.operator ++()和a1=a2.operator ++(a3)都稱為顯式呼叫

3、用友元函式過載運算子

C C 基礎知識總結 多型性

1.多型性的概述 1.1 多型是指同樣的訊息被不同型別的物件接收時導致不同的行為。所謂訊息是指對壘的成員函式的呼叫,不同行為是指不同的實現。1.2 多型的實現 1 實現角度講多型可分為兩類 編譯時的多型和執行時的多型。編譯時 編譯過程中確定了同名操作的具體操作物件。靜態繫結。執行時 程式執行時動態確...

C 多型性總結

多型性是c 語言最重要的基本特徵之一 正是因為多型性的靈活,才使之如此重要,也需要仔細思考才能很好把握 多型 polymorphism 動態繫結使編譯器能夠在執行時決定使用基類中定義的函式還是派生類中定義的函式 虛函式的前提是有基類及其派生類 在基類中要有虛函式的定義 成員函式的virtual宣告....

C 多型性總結

c 物件導向程式中存在三種多型 1 物件型別的多型。派生類的物件的型別既可以是派生類,也可以是基類,即乙個物件可以屬於多種型別。2 物件標識的多型。基類的指標或引用可以指向或引用基類物件,也可以指向或引用派生類物件,即乙個物件標識可以屬於多種型別,它可以標識多種物件。在物件識別符號定義時指定的型別稱...