一個面向對象的系統常常要求一組具有相同基本語義的方法能在同一接口下為不同的對象服務,這就是多态性(polymorphism).
通俗的來說,多态就是在一個方法在不同基類的派生類中表現出不同的實作形式。比如,定義水果類為基類,蘋果,梨,香蕉為派生類,在水果類,蘋果,梨,香蕉中都有一個計算蒸發率的成員函數,但是,在蘋果,梨,香蕉中,因為他們是不同水果,有不同蒸發率,是以,雖然同樣是計算蒸發率,但是計算的方法不同,這種用不同方法計算不同派生類蒸發率的方式就是多态。
在C++中,多态分為:編譯時的多态性和運作時的多态性。其中,編譯時的多态性通過重載和模闆來實作,其實作的機制為一種靜态綁定的機制;而運作時的多态性通過虛函數來實作,其實作的方式為一種動态綁定的方式。
先來看一種靜态綁定機制的多态:
結果如我們所預料的那樣:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPR50dFRVTqh2RiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM0ETOwQTNwEjMwMDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
Singer Jay和ProgrammerVac分别調用本類中定義的print()函數,輸出的結果也是我們想要的。但是這種調用是建立在靜态綁定機制上的,不具備多态特征。
PS:
多态調用是借助于指向基類的指針或引用的調用。
下面來看一下用指針通路的情況:
運作時出現如下結果:
這顯然不是我們想要得到的,指針所執行的函數都是基類的print()函數,根本沒有實作多态。
解決方法:
隻要在聲明基類People的時候,将print()聲明為虛函數,則在用指針或引用通路print()函數的時候,調用的是指針所指向的重定義的函數,而不是指向原來基類中的函數。
總結虛函數:
指向基類的指針在操作它的多态類對象時,會根據不同的類對象,調用其相應的函數,這個函數就是虛函數。