多態(tài)按字面的意思就是多種形態(tài)腺办。當(dāng)類之間存在層次結(jié)構(gòu)腕扶,并且類之間是通過繼承關(guān)聯(lián)時藻雌,就會用到多態(tài)雌续。
C++ 多態(tài)意味著調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)胯杭。
當(dāng)上面的代碼被編譯和執(zhí)行時驯杜,它會產(chǎn)生下列結(jié)果:
Parent class area
Parent class area
導(dǎo)致錯誤輸出的原因是,調(diào)用函數(shù) area() 被編譯器設(shè)置為基類中的版本做个,這就是所謂的靜態(tài)多態(tài)鸽心,或靜態(tài)鏈接?- 函數(shù)調(diào)用在程序執(zhí)行前就準(zhǔn)備好了滚局。有時候這也被稱為早綁定,因為 area() 函數(shù)在程序編譯期間就已經(jīng)設(shè)置好了顽频。
但現(xiàn)在藤肢,讓我們對程序稍作修改,在 Shape 類中糯景,area() 的聲明前放置關(guān)鍵字?virtual嘁圈,如下所示:
虛函數(shù)
虛函數(shù)?是在基類中使用關(guān)鍵字?virtual?聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時蟀淮,會告訴編譯器不要靜態(tài)鏈接到該函數(shù)最住。
我們想要的是在程序中任意點可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接怠惶,或后期綁定涨缚。
純虛函數(shù)
可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象策治,但是在基類中又不能對虛函數(shù)給出有意義的實現(xiàn)仗岖,這個時候就會用到純虛函數(shù)。