1、概述
之前感覺對多态了解的挺深入的,任何多态的問題都難不倒我,然後我發現有靜态多态的概念,一下子就懵掉了。是以有時候不要太自信,多看看就很容易碰到自己的隻是盲區,趁着這個機會,把多态的内容給整理一下。
多态:即多種形态,調用同一種方法,不同的類型,會有不同狀态的操作。
C++ 裡面的多态可以分為:靜态多态和動态多态。靜态多态很容易了解,就是編譯時就知道的重載;動态多态是需要在運作期确定的。

2、靜态多态
靜态多态就是編譯時期的多态。靜态多态又可以分為:函數重載和泛型程式設計。
函數重載,學習C++都知道,在相同作用域中,函數名相同,參數的數目或者順序不同的函數構成重載。在函數使用時,我們可以調用任何一個函數,編譯器會根據我們傳入的參數來定位實際上調用的函數。
泛型程式設計,其實就是定義模闆函數,在實際使用時,通過傳入不同的類型,編譯器對其具象化。因為是編譯器時期進行的操作,是以是靜态多态。
3、動态多态
之前在整理虛函數的原理時,我們講過多态實作的具體原理。這裡進行簡單的描述:
1、基類中使用關鍵字virtual聲明虛函數
2、隻要類中有虛函數,類對象在構造的時候,編譯器會給這個對象生成一個虛函數指針vptr
3、虛函數指針指向一個表,此表記錄着此類中所有虛函數的位址
4、如果派生類對基類的虛函數進行重寫,則派生類會對此類虛函數表中的相應位址進行修改
5、使用基類的指針或者引用派生類的對象,則對象中虛指針指向派生類的虛函數表
6、使用時,會根據虛函數表中的位址,動态的加載相應的函數
7、如果直接使用基類對象,則會發生切割行為,虛函數表也是基類的虛函數表資料。
動态多态需要三個條件:繼承、虛函數、指向基類的指針或引用,這三者缺一個都構不成動态多态。
4、比較
靜态多态是在編譯器完成,是以效率較高,編譯器也可以進行優化。有很強的适配性和松耦合性。
動态多态是運作期确定的,需要一定時間的開銷,而且編譯器無法對其進行優化。但是它是面向對象的設計,可以把實作和接口分離,可以複用,處理同一繼承體系下的對象集合威力強大。
5、其它
還聽過一種:通用多态和專有多态。
通用多态又可以分為:參數多态(模闆)和 包含多态(虛函數)
專有多态又可以分為:重載多态和強制多态。
我也不知道這些個概念是怎麼來的,也不知道正确性,詳細内容需要大家自行查資料了。
感謝大家,我是假裝很努力的YoungYangD(小羊)。