C++多態
C++的多態包括靜態多態和動態多態,靜態多態包括函數重載和泛型編程,動態多態包括虛函數。靜態多態實在編譯期間就能確定,動態多態實直在程序運行時才能確定。
抽象類
虛函數
在默認情況下對函數成員調用實施的是靜態連編,也叫做靜態綁定。如果子類中的函數fff覆蓋了父類中的函數fff,那么基類中的其他函數調用函數fff的時候調用的仍然是基類中的函數而不是子類的。
為了解決這個問題可以在基類和子類的fff函數前加上virtual
關鍵字,該函數就會變成虛函數,當在子類中調用基類的函數時,如果該函數調用到函數fff調用的就是子類的函數。
對于虛函數,編譯器完成的是動態連編(動態綁定)面對虛函數的調用是在程序運行的時候確定的。
純虛函數
在實際編程中我們有些方法經常沒有辦法實現(沒有對應的成員或者不同的子類實現方法不同),我們就將函數聲明為純虛函數,這樣就不需要實現。純虛函數的聲明形式為:
virtual 返回類型 方法名(參數列表)=0;
抽象類指的是含有純虛函數或者基類的純虛函數還沒有將其實現的類。
很顯然,抽象類是不能被實例化的。只有子類中將所有的純虛函數都實現了以后(此時就不是抽象類了)才可以進行實例化。
虛繼承和虛基類
在多重繼承時如果我們繼承的類繼承于同一個類(或者繼承的類之間有繼承關系等)就會出現多個相同的成員的情況,在訪問這些成員的時候我們必須加上基類的名字空間來進行區別,否則就會出錯。
但是一般情況下這種重復的變量是沒有什么意義的,為了解決這種重復沖突加浪費的問題,我們可以使用虛繼承,即在繼承的時候在基類的名字前加上virtual
,這樣當其他類再繼承這個類的時候如果已經繼承了更上層的基類只會保存一份成員。
虛繼承的目的時讓某個類作出聲明,承諾愿意共享它的基類。其中這個被共享的類稱為虛基類。