多型
多型的概念
相同物件收到不同訊息或不同物件收到相同的訊息時產生不同的動作;
即允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。
多型分類:
1) 靜態多型:(也稱早繫結或者靜態鏈編)編譯器在編譯期間完成的,編譯器根據韓式實參的型別(可能會進行隱式型別轉換),可推斷出要呼叫那個函式,如果有對應得函式就呼叫該函式,否則出現編譯錯誤。
2) 動態多型:(也稱晚繫結或者動態鏈編)在程式執行期間判斷所引用物件的實際型別,根據其實際型別調相應的方法。
使用virtual關鍵字修飾類的成員函式時,指明該函式為虛函式,派生類需要重新實現,編譯器將實現動態繫結。
3.動態繫結的條件:
1)必須是虛函式,派生類要重寫基類的虛函式;
2)通過基類型別的引用或者指標呼叫函式;
class cbase
void funtest2(int _itest)
virtual void funtest3(int _itest1)
virtual void funtest4( int _itest)
}; class cderived :public cbase
virtual void funtest2(int _itest) //基類中沒有加virtual,為構成重寫
void funtest3(int _itest1)
virtual void funtest4(int _itest1,int _itest2) //引數不同,未構成重寫
}; int main()
繼承體系同名成員函式的關係:
a.過載:在同一作用域中、引數相同、函式名相同、返回值不要求可同可不同;
b.重寫(覆蓋):在不同作用域中、引數相同、函式名相同、返回值相同,基類函式必須有virtual關鍵字,訪問修飾符可不一樣;
c.隱藏(重定義):在不同作用域中、函式名相同,不是重寫就是重定義;
4.純虛函式:在成員函式的形參後面寫上=0;則成員函式為純虛函式。
含有純虛函式的類時抽象類,不能例項化出物件。純虛函式在派生類中重新定義以後,派生類才能例項化出物件;
格式:
virtual 函式型別 函式名 (引數列表)=0;
eg:virtual void test (int a,int b)=0;
注意:
1) 純虛函式沒有函式體—-只有函式名字而不具備函式的功能,不能被呼叫。在派生類中對此函式提供定義後,他猜猜具備函式的功能,可以被呼叫;
2) 最後面的「=0」並不表示函式返回值為0,只起形式上的作用,告訴編譯器這是純虛函式;
3) 這是乙個宣告語句,最後應有分號;
4) 純虛函式的作用:是在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義,如果在基類中沒有保留函式的名字,則無法實現多型性;
class person
;class student:public person
{};總結:
1)、派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值完全相同。(協變除外)
2)、基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性。
3)、只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義為虛函式。
4)、如果在類外定義虛函式,只能在宣告函式時加virtual關鍵字,定義時不用加。
5)、建構函式不能定義為虛函式,雖然可以將operator=定義為虛函式,但最好不要這麼做,使用時容易混淆
6)、不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會出現未定義的行為。
7)、最好將基類的析構函式宣告為虛函式。(析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但是構成覆蓋,這裡編譯器做了特殊處理)
8)、虛表是所有類物件例項共用的虛表剖析
class ctest
private:
int itest; //結果為4
}; int main()
5.抽象類:
1)概念:不用來定義物件而只作為一種基本的型別用作繼承的類,稱為抽象類;
2)目的:是用它作為基類去建立派生類;
3)如果在抽象類所派生出的新類中對基類的所有純虛函式進行了定義,那麼這些函式就被賦予了功能,可以被使用。
這個派生類不是抽象類,而是可以用來定義物件的具體類。如果在派生類中沒有對所有純虛函式進行定義,則此派生類仍然是抽象類,不能用來定義物件。
c 多型總結
多型 多型可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。接下來,我寫乙個簡單地函式來說明多型 includeusing namespace std int add int left,int right float add float left...
C 多型總結
多型繫結分兩種情況,一種是靜態繫結即編譯時多型,一種是動態繫結即執行時多型是利用過載實現的。對於非虛函式的成員來說,系統在編譯時,按照函式的引數的區別來繫結要實現的操作,在編譯時就確定了呼叫哪個函式。簡單地說,虛函式是動態繫結的基礎 動態繫結是實現執行時多型的基礎。要觸發動態繫結,需滿足兩個條件 1...
C 多型總結
多型概念 同乙個事物在不同環境下具有不同的狀態 虛函式概念 在函式返回值前加上 virtual 關鍵字 多型分類 靜態多型 早繫結 在編譯器編輯時確認要呼叫的函式 1 函式過載 2 泛型程式設計 動態多型 晚繫結 在程式執行時確認將要呼叫的函式 1 基類中存在虛函式 2 繼承當中對基類進行重寫並且 ...