相信不少入門C++的萌新都會被灌輸這么一個理念,那就是C++是面向對象編程,並且有三大特性,繼承封裝多態。首先我們了解一下這三個特性的大概含義和優缺點,再看看為什么這三個特性是C++獨有的而C沒有。
(1)繼承:
C有struct,也能往里面塞函數或者數據,乍一看和C++的class差不多,然而C的struct卻不能繼承,這是三大特性其一,多了繼承這個概念。
優點:1.減少重復的代碼。
2.繼承是多態的前提。
3.繼承增加了類的耦合性。
缺點:1.繼承在編譯時刻就定義了,無法在運行時刻改變父類繼承的實現;
2.父類通常至少定義了子類的部分行為,父類的改變都可能影響子類的行為;
3.如果繼承下來的子類不適合解決新問題,父類必須重寫或替換,那么這種依賴關系就限制了靈活性,最終限制了復用性。
虛繼承:為了解決多重繼承中的二義性問題,它維護了一張虛基類表。
(2)封裝:
隱藏對象的屬性和實現細節,僅僅對外提供接口和方法。相比較於C,struct中函數和成員數據都是公開的,因為C沒有訪問限定符public,private,protected這種說法,所以C也無法封裝函數或者數據,不讓調用者可以直接調用,這是三大特性其二,C++相比C多了封裝。
優點: 1)隔離變化;2)便於使用; 3)提高重用性; 4)提高安全性
缺點: 1)如果封裝太多,影響效率; 2)使用者不能知道代碼具體實現。
(3)多態:
C++中有兩種多態,稱為動態多態(運行期多態) 和靜態多態(編譯期多態),如下圖,接下來我們展開講講。
靜態多態
靜態多態主要通過函數重載和模板來實現,宏也是實現靜態多態的一種途徑 。
函數重載
int Add(int left, int right) { return left + right; } double Add(double left, int right) { return left + right; } int main() { Add(10, 20); //Add(10.0, 20.0); //這是一個問題代碼 Add(10.0,20); //正常代碼 return 0; }
泛型編程
所以泛型,實質上就是不使用具體數據類型(例如 int、double、float 等),而是使用一種通用類型來進行程序設計的方法,該方法可以大規模的減少程序代碼的編寫量,讓程序員可以集中精力用於業務邏輯的實現。在C++中就是指的模板,模板本身也是多態的一種體現。
動態多態
動態多態在C++中是通過虛函數實現的 ,即在基類中存在一些接口(一般為純虛函數),子類必須重載這些接口。這樣通過使用基類的指針或者引用指向子類的對象,就可以實現調用子類對應的函數的功能。動多態的函數調用機制是執行期才能進行確定,所以它是動態的。
虛函數
優點:1.大大提高了代碼的可復用性;
2.提高了了代碼的可維護性,可擴充性;
缺點:1.易讀性比較不好,調試比較困難
2.模板只能定義在.h文件中,當工程大了之后,編譯時間十分的變態
第三點多態,主要體現在函數重載,模板和虛函數這三個點,讓同一個函數在不同參數的情況下產生不同效果,或者兩個繼承關系的類的對象調用同一個方法卻得到不同的效果。
