初識C 物件導向特性 多型

2022-05-07 05:36:08 字數 1522 閱讀 6253

個人理解,用一句話來概括多型就是:乙個介面(函式)能實現不同種方法

c++的多型分為靜態多型和動態多型

動態多型:繼承並重寫基類的虛函式

關於靜態多型(過載),比較簡單,下面用兩段**來演示一下

#include#include

using

namespace

std;

void printinp(int

a);void printinp(string

a);int main(void

)void printinp(int

a)void printinp(string

a)

第一段**通過過載實現了函式的多型

#includeusing

namespace

std;

classa};

class b :publica};

int main(void

)

第二段**通過過載實現了類中成員函式的(靜態)多型

為什麼要使用虛函式來實現動態多型呢,因為存在這種情況:父類想通過多型的特性使用子類的成員函式,如下面**所示

#includeusing

namespace

std;

class

a

virtual

void

func2()

};class b :publica};

class c :publica};

int main(void

)

執行結果如下

可以看到test想通過多型特性使用指標呼叫子類b中的成員函式,但是他呼叫的仍然是他自己的func1(),為什麼會這樣?就要從動態多型的實現原理——虛表說起

弄清了虛表結構之後回到上面的**,通過虛函式我們能實現什麼操作?虛函式該怎麼用來實現(動態)多型?

首先通過虛函式,父類可以呼叫子類的成員函式

使用方法:

father* a=new

son;

a->function();

此時類a呼叫的function()就是子類中的function

要注意的是虛函式只能通過指標或者引用來達到多型效果,直接例項化乙個類然後直接呼叫虛函式是無法實現多型的

解釋一下為什麼基類析構函式要寫成虛函式

father* a=new

son;

delete a;

實際上,在編譯器中,析構函式會被特殊處理,他們也是具有多型性的函式。a的型別是子類,所以析構a的時候需要用son的析構函式,但是如果父類中的析構函式沒有使用虛函式,那麼delete a在啟動虛構函式時,會直接呼叫父類的析構函式,new son申請到的空間就沒有得到**,會造成記憶體洩漏。

總結一下多型的優點

可替換、可擴充套件、靈活、使用簡單以及介面性(介面行是什麼意思還沒弄清)

物件導向特性 多型

1 抽象類和方法 只在父類中宣告,在子類中實現,用abstract宣告。作用是給子類作規範。規則 抽象類不能例項化,只能被繼承 抽象方法必須被子類方法重寫。建立 abstract class computer 抽象類裡面的抽象方法必須在子類裡面重寫,不然會報錯。abstract class comp...

物件導向特性 多型

多型的概念 類的多型是類的重要特性,它可以讓例項在呼叫他們的共同屬性時不考慮具體的類,體現的是一種執行時的繫結關係 動態繫結 類的多型體現在同乙個類例項化出來的物件呼叫同乙個方法,執行的邏輯不相同 注意 體現類的多型有兩個條件 1.有子類的繼承 2.子類需要呼叫這個方法 所以,多型算是繼承的實現細節...

物件導向特性 多型

動態繫結 父類的引用,引用子類的物件 直接賦值 student stu newcollegestudent df soft 方法傳參 3.返回值接收 滿足動態繫結的條件 向上轉型並且通過父類呼叫子類重寫的方法 編譯時 呼叫父類的方法 執行時 呼叫子類重寫的方法。子類實現父類同名方法,並且引數的型別和...