C C 基礎知識總結 多型性

2022-08-05 09:00:18 字數 3391 閱讀 1340

1. 多型性的概述

1.1 多型是指同樣的訊息被不同型別的物件接收時導致不同的行為。所謂訊息是指對壘的成員函式的呼叫,不同行為是指不同的實現。

1.2 多型的實現

(1) 實現角度講多型可分為兩類:編譯時的多型和執行時的多型。

① 編譯時:編譯過程中確定了同名操作的具體操作物件。靜態繫結。

② 執行時:程式執行時動態確定操作針對的具體物件。動態繫結。

2. 運算子過載

2.1 運算子過載就是對已有的運算子賦予多重含義,使同乙個運算子作用域不同型別的資料導致不同的行為。

2.2 運算子過載的實質是函式過載。在實現過程中,首先把制定的運算表示式轉化為對運算子函式的呼叫,然後把運算物件轉化為運算子函式的實參,然後根據實參型別確定呼叫的函式,這個過程是在編譯過程完成的。

2.3 運算子過載的規則

(1) 只能過載c++中已經有的運算子

(2) 過載之後的優先順序和結合型不變

(3) 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。因此過載後的功能因該與原功能類似,不能改變操作物件個數,同時至少有乙個操作物件是自定義型別

2.4 運算子過載的形式:過載為類的非靜態成員函式和過載為類的成員函式

(1) 過載為類的成員函式

返回型別 operator 運算子(形參表)

{}(2) 過載為非成員函式。此時有可能需要將此函式宣告為友元函式。

返回型別 operator 運算子(形參表)

2.5 運算子過載為成員函式

(1) 雙目運算子

左運算元是物件本身資料,由this指標指出,有運算元是通過過載函式的參數列實現

雙目運算子b。 為了實現 oprd1 b oprd2。 應該把b實現為oprd1的過載運算子函式,該函式有乙個形參,型別是oprd2對應的型別。過載後,oprd1 b   oprd2即為 oprd1.operator b(oprd2)

例子:

complex operator+ (const complex &c2) const

;complex complex::

operator+ (const complex &c2) const

(2) 前置單目運算子

運算元由物件的this指標指出,無需引數

比如』-『等運算子u, u oprd.應該過載為oprd型別的成員函式,沒有形參。表示式 u oprd即為 oprd.u()

例子:

clock& operator++();

clock& clock::opertor++()

(3) 後置單目運算子

運算元由物件的this指標指出。

比如++和--,此時,運算子應過載為物件的成員函式,這個函式有乙個int 的形參,這個引數沒有用處,只是為了區分前置和後置

例子:

clock operator++(int

);clock clock::

operator++(int

)

2.6 運算子過載為非成員函式

(1) 對於雙目運算子b,如果要實現oprd1 b oprd2,其中oprd1和oprd2中只要有乙個具有自定義型別,就可以將b過載為非成員函式,函式的形參oprd1 和 oprd2。經過過載後oprd1 b oprd2 就相當於函式呼叫operator b(oprd1, oprd2)

(2) 其他的類似,就是多個引數

(3) 例子:

class

complex

complex

operator+(const complex &c1, const complex &c2)

ostream & operator

<<(ostream &out, const complex &c)

3. 虛函式

3.1 虛函式是動態繫結的基礎。虛函式必須是非靜態的成員函式。虛函式經過派生後就可以實現執行過程中的多型。

3.2 如果需要通過基類的指標指向派生類的物件,並且訪問某個與基類同名的成員,那麼首先在基類中將這個同名函式宣告為虛函式。

3.3 一般虛函式成員

(1) 宣告語法:

virtual 函式型別 函式名(形參表)

(2) 虛函式宣告只能出現在類定義中的函式原型宣告中,而不能在成員函式實現的時候。

(3) 如果基類宣告了虛函式,而派生類相應函式沒有宣告virtual,那麼系統根據如下規則:

① 該函式是否與基類的虛函式有相同名稱

② 該函式是否與基類的虛函式有相同的引數

③ 該函式是否與基類的虛函式有相同的返回值或者滿足複製相容規則的指標、引用型的返回值

(4) 只有虛函式是動態繫結的,如果派生類需要修改基類的行為(即重寫與基類函式同名的函式),就應該在基類中將相應的函式宣告為虛函式。而基類中宣告  的非虛函式,通常代表那些不希望被派生類改變的功能,也是不能實現多型的。一般不要重寫繼承而來的非虛函式,那會導致通過基類指標和派生類指標或者對  象呼叫同名函式時產生不同的後果,從而引起混亂。

3.4 虛析構函式

(1) 如果基類宣告為虛析構函式,則派生類的建構函式也為虛函式。

(2) 如果需要用基類的指標呼叫派生類的析構函式則一定要宣告虛析構函式。

4. 純虛函式與抽象類

建立抽象類就是為了通過多型使用成員函式。抽象類自身無法例項化,只能通過繼承機制,生成非抽象派生類,再進行例項化。

4.1 純虛函式

(1) 純虛函式是乙個在基類中宣告的虛函式,在基類中沒有定義具體的操作,要求各派生類根據實際需要給出自己的定義。

(2) 宣告格式:

virtual 函式型別函式名(參數列)= 0;//後面的 = 0

(3) 宣告為虛函式後,基類中就可以不再給出函式的實現部分。

(4) 如果將析構函式宣告為純虛函式,則必須在基類中給出它的實現,因為派生類的析構函式執行完後需要呼叫基類的析構函式。實際上,基類中是可以給出純  虛函式的函式體,但是即使給出,也必須由派生類覆蓋。

4.2 抽象類

(1) 帶有純虛函式的類是抽象類。抽象類的主要作用是通過它為乙個類族建立乙個公共介面。

(2) 抽象類派生出新的類後,如果派生類給出所有純虛函式的函式實現,這個派生類就可以定義自己的物件。

(3) 抽象類不能例項化。

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

多型 一種行為對應著多種不同的實現。根據c 實現多型的不同階段,多型的實現分為靜態聯編和動態聯編。靜態聯編 在程式編譯階段就能實現的多型性,這種多型性成為靜態多型性 編譯時的多型性 可通過函式過載和運算子過載實現 運算子過載是一種特殊的函式過載 動態聯編 在程式執行階段實現的多型性,這種多型性稱為動...

C 多型性總結

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

C 多型性總結

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