個人理解,用一句話來概括多型就是:乙個介面(函式)能實現不同種方法
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此時類a呼叫的function()就是子類中的functionson;
a->function();
要注意的是虛函式只能通過指標或者引用來達到多型效果,直接例項化乙個類然後直接呼叫虛函式是無法實現多型的
解釋一下為什麼基類析構函式要寫成虛函式
father* a=new實際上,在編譯器中,析構函式會被特殊處理,他們也是具有多型性的函式。a的型別是子類,所以析構a的時候需要用son的析構函式,但是如果父類中的析構函式沒有使用虛函式,那麼delete a在啟動虛構函式時,會直接呼叫父類的析構函式,new son申請到的空間就沒有得到**,會造成記憶體洩漏。son;
delete a;
總結一下多型的優點
可替換、可擴充套件、靈活、使用簡單以及介面性(介面行是什麼意思還沒弄清)
物件導向特性 多型
1 抽象類和方法 只在父類中宣告,在子類中實現,用abstract宣告。作用是給子類作規範。規則 抽象類不能例項化,只能被繼承 抽象方法必須被子類方法重寫。建立 abstract class computer 抽象類裡面的抽象方法必須在子類裡面重寫,不然會報錯。abstract class comp...
物件導向特性 多型
多型的概念 類的多型是類的重要特性,它可以讓例項在呼叫他們的共同屬性時不考慮具體的類,體現的是一種執行時的繫結關係 動態繫結 類的多型體現在同乙個類例項化出來的物件呼叫同乙個方法,執行的邏輯不相同 注意 體現類的多型有兩個條件 1.有子類的繼承 2.子類需要呼叫這個方法 所以,多型算是繼承的實現細節...
物件導向特性 多型
動態繫結 父類的引用,引用子類的物件 直接賦值 student stu newcollegestudent df soft 方法傳參 3.返回值接收 滿足動態繫結的條件 向上轉型並且通過父類呼叫子類重寫的方法 編譯時 呼叫父類的方法 執行時 呼叫子類重寫的方法。子類實現父類同名方法,並且引數的型別和...