C++三大特性


相信不少入門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文件中,當工程大了之后,編譯時間十分的變態
      
 
 
第三點多態,主要體現在函數重載,模板和虛函數這三個點,讓同一個函數在不同參數的情況下產生不同效果,或者兩個繼承關系的類的對象調用同一個方法卻得到不同的效果。 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM