天天看點

C++面向對象總結——多态

了解c++的三大特性是對c++的整體的認識。

封裝性: 類将成員變量和成員函數封裝在類的内部,根據需要設定通路權限,通過成員函數管理内部狀态(用通路修飾符設定)

繼承:繼承所表達的是類之間相關的關系,這種關系使得對象可以繼承另外一類對象的特征和能力。作用:避免公用代碼的重複開發,減少代碼和資料備援。

多态:多态性可以簡單地概括為“一個接口,多種方法”,字面意思為多種形态。程式在運作時才決定調用的函數,它是面向對象程式設計領域的核心概念。比如函數重載、運算符重載、虛函數等

前些章已經介紹了繼承,重載,本篇就在此基礎上詳說一下多态。

多态按字面的意思就是多種形态。當類之間存在層次結構,并且類之間是通過繼承關聯時,就會用到多态。

C++ 多态意味着調用成員函數時,會根據調用函數的對象的類型來執行不同的函數。

下面的執行個體中,基類 Shape 被派生為兩個類,如下所示:

C++面向對象總結——多态

 可以發現運作結果和我們期望的不一樣。什麼原因造成的呢?

解答:這是由于調用函數 area() 被編譯器設定為基類中的版本,這就是所謂的靜态多态,或靜态連結 ( 函數調用在程式執行前就準備好了)。有時候這也被稱為早綁定,因為 area() 函數在程式編譯期間就已經設定好了。

但現在,讓我們對程式稍作修改,在 Shape 類中,area() 的聲明前放置關鍵字 virtual,如下所示:

修改後,當編譯和執行前面的執行個體代碼時,它會産生以下結果:(運作成功!)

C++面向對象總結——多态

此時,編譯器看的是指針的内容,而不是它的類型。是以,由于 tri 和 rec 類的對象的位址存儲在 *shape 中,是以會調用各自的 area() 函數。

每個子類都有一個函數 area() 的獨立實作。這就是多态的一般使用方式。有了多态,您可以有多個不同的類,都帶有同一個名稱但具有不同實作的函數,函數的參數甚至可以是相同的。

虛函數 是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜态連結到該函數。

我們想要的是在程式中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱為動态連結,或後期綁定。

什麼是純虛函數?

如果我們想要在基類中定義虛函數,以便在派生類中重新定義該函數更好地适用于對象,但是在基類中又不能對虛函數給出有意義的實作,這個時候就會用到純虛函數。

我們可以把基類中的虛函數 area() 改寫如下:

area()= 0 就是告訴編譯器,函數沒有主體,上面的虛函數是純虛函數。

繼續閱讀