c 中的多型

2021-09-06 21:14:19 字數 2188 閱讀 3902

c++中的多型

什麼是多型

多型是指有多種形態,具體來說就是一種行為有多種不同的狀態。當有不同的物件完成同乙個行為時,會產生不同的結果。在c++的呼叫同乙個基類函式,會根據不同的物件的型別來呼叫不同的成員函式。多型是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。

多型的構成條件

在c++中要構成多型,必須要滿足兩個條件:

多型是基於繼承實現的,在繼承關係下,不同類的物件,通過呼叫同乙個基類的介面函式,可以根據不同的物件呼叫到不同的成員函式。

要構成多型則在呼叫時,呼叫的函式由物件來決定,而不根據呼叫的物件的型別來決定。

簡單的多型的例子

#include using namespace std;

class father

protected:

int count;

};class son : public father

private:

int count;

};int main()

重寫

虛函式:在函式前加virtual即為虛函式。

虛函式的重寫: 在繼承關係中派生類中有乙個和基類完全相同的虛函式,即函式名, 引數型別, 引數個數,返回值(協變時可以不相同)都相同。此時稱該虛函式重寫了基類中的虛函式,重寫也叫覆蓋。此時在派生類中只能訪問到派生類中的該函式,從基類中繼承的該函式以經被派生類中的該函式覆蓋。

協變:在重寫的過程中有乙個例外,其返回值可以不同,此時也構成重寫。但此時返回值必須是派生類或基類指標,派生類或基類的引用。

不規範的重寫行為:當派生類對基類的虛函式進行重寫時,可以不用加virtual ,因為從基類繼承下來的而虛函式,其預設的屬性仍為虛函式,我們只對其進行重寫。但這是一種不規範的寫法

派生類的析構函式與基類的析構函式構成了重寫。

派生類的析構函式與基類的析構函式儘管函式名不相同,但在編譯器的特殊處理下,兩個析構函式被處理成了同名函式destructor。所以要將基類的析構函式做好寫成虛函式。

為什麼將析構函式寫成虛函式

如果不使用在析構函式的時候不使用virtual,使用動態繫結,則在析構的時候就會忽略掉派生類的部分,如果我們派生類中進行了空間的開闢,而在派生類的析構中對其進行釋放,如過不呼叫派生類析構,會造成記憶體洩漏。

class father 

};class son : public father

};//只有基類析構函式與派生類的析構函式構成多型時,在析構時才能正確的析構不同物件

int main()

//當基類的析構函式不是虛函式時,兩個析構函式沒有構成多型,

//所以在析構的時候,根據型別析構,忽略了派生類的部分,會造成記憶體洩漏

class father

};class son : public father

};int main()

關於過載 隱藏 重寫三者之間的關係

過載:在同乙個作用域中即同乙個類中,函式名相同,引數個數或型別不同就構成了過載。

隱藏:在兩個不同的作用域中,即在繼承關係中的基類和派生類兩個作用域中,如果派生類與基類中有同名函式,如果不是重寫就一定構成了隱藏。隱藏也叫重定義。

重寫:在兩個不同的作用域中,即派生類與基類中如果函式名,引數,返回值(協變除外)都相同,就構成了重寫。兩個函式都必須是虛函式。重寫稱為覆蓋。

實現繼承與介面繼承純虛函式:

純虛函式即值在函式後面新增 = 0 ,只對函式進行宣告,並不對函式進行實現。而在派生類中對於函式進行實現。

#include using namespace std;

class person;

class children : public person

};class parents : public person

};int main()

};

C 中的多型

封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...

C 中的多型

c 中的多型分為靜多型和動多型 也就是靜態繫結和動態繫結兩種現象 靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型 發生在執行期的則是動態繫結,也就是動多型。一 靜多型可以通過模板和函式過載來實現,下面舉兩個例子 1 函式模板 template t max c...

C 中的多型

定義 同樣的訊息被不同型別的物件接收時產生不同的行為。原理 1.編譯時多型 靜態繫結 2.執行時多型 動態繫結 分類 1.過載 包括函式過載,運算子過載 靜態繫結 2.覆蓋 包括子類和父類間虛函式 虛析構函式和純虛函式 動態繫結 要求 1.函式名相同 2.引數不同 栗子 include using ...