C 多型實現方式詳情

2022-09-20 18:30:08 字數 1195 閱讀 6312

在我們之前介紹的繼承的情況當中,派生類呼叫基類的方法都是不做任何改程式設計客棧動的呼叫。

但有的時候會有一些特殊的情況,我們會希望同乙個方法在不同的派生類當中的行為是不同的。舉個簡單的例子,比如speak方法,在不同的類當中的實現肯定是不同的。如果是human類,就是正常的說話,如果是dog類可能是汪汪,而cat類則是喵喵。

在這種情況下只是簡單地使用繼承是無法滿足我們的要求的,最好能夠有乙個機制可以讓方法有多種形態,不同的物件去呼叫的邏輯不同。這樣的行為稱為多型。

這裡稍微強調一下,多型是一種物件導向的設計思路,本身和c++不是強繫結的,其他語言當中一樣有多型,只不過實現的方式可能有所不同。

在c++當中有兩種重要的機制用於實現多型:

我們來看乙個例子:

class mammal

string name() const

virtual void speak() const

virtual ~mammal() {};

};class human : public mammal

virtual void speak() const

};由於示例比較簡單,所以我們把類的宣告和實現寫在一起了。

從結構上來看,這就是乙個簡單的繼承,我們實現了兩個類,乙個叫做mammal,乙個叫做human,然後給它們各自定義了一些成員變數。

值得注意的是speak函式,我們在函式宣告前面加上了乙個關鍵字virtual,這表示這是乙個虛函式。程式設計客棧

方法被定義成虛方法之後,在程式執行的時候,將會根據派生類的型別來選擇執行的方法版本。在進行呼叫的時候,程式是根據物件型別而不是引用和指標的型別來選擇執行的方法,

如:mammal *m = new human("man", "spiderman");

m->speak();

這裡我們用乙個mammal的指標指向了乙個human型別的物件,當我們呼叫方法的時候,由於speak方法是乙個虛方法。因此執行的時候程式會根據物件的型別也就是human去執行human物件中的speak方法,而不是mammal中的。

通常我們會將析構函式也設定成虛方法,因為派生類當中往往有一些專屬成員,這是一種慣例。因為如果析構函式不是虛函式,那麼只會呼叫對應指標型別的析構函式,這意味著可能在一些情況下產生錯誤和問題。

在上述的示例當中,我們是將類方法的實現和宣告寫在一起了,如果還是採取和之前一樣分開實現的方式,需要注意我們無需在函式簽名中加上virtual關鍵字。

c 多型實現的方式

1.多型概念 讓乙個物件能夠表現出多種狀態 型別 實現多型的條件 類必須具有繼承。2.實現多型的三種方法 1 虛方法 2 抽象類 3 介面 步驟 1 在父類的返回型別前加virtual 表示成虛方法 2 在子類的返回型別前加override,表示將父類的方法重新寫一遍。per i sayhello ...

多型及實現方式

多型性 一詞最早用於生物學,指同一種族的生物體雖然具有相同的本質特徵,但在不同環境中可能呈現出不同的特性。例如 狗的多型性。物件導向開發中的多型 舉例說明 多型的好處 多型有三種實現方法 抽象類 介面 虛方法 很平常的類,只需要在需要重寫的方法前面新增virtual,就可以被其子類重寫,而virtu...

C 多型三種實現方式

定義 多型的定義簡單來說就是使一條語句有多種狀態。實現方式 多型的實現方式分為三塊 過載 重寫 重定義。下面我們來談一談他們各自的實現方式和實現原理。過載實現方式 過載是在同一作用域內 不管是模組內還是類內,只要是在同一作用域內 具有相同函式名,不同的形參個數或者形參型別。返回值可以相同也可以不同 ...