有了繼承才有多型的概念,首先說一下繼承。
繼承的概念是派生類可以呼叫基類的成員。常舉的例子,動物是基類,它擁有所有動物共有的一些特徵和方法。它會衍生出貓的類,狗的類,派生出的類除了有動物公共的特性,還有屬於他們自己的,例如叫聲,科目等等。
繼承的好處就是我們不需要重複地去編寫每個類的公共屬性。只需要在對應的類新增屬於它獨特的特性就可以。
繼承的型別有三種:公有繼承,保護繼承和私有繼承。
公有繼承:基類的保護是派生的保護,基類的公有是派生類的公有。就好比這是公共財產,是公家的,你接手了上一任的工作後,接到的繼承是原封不動的,保護是保護,公有是公有,性質不許變。(基類的私有成員可以通過繼承的函式獲得)
私有繼承:繼承得來的東西都變成自己的東西,子承父業,雖然我的前一任很大公無私,但是到了自己手裡都放入囊中,全部變成自己的(私有)。
任何類的建構函式,析構函式,拷貝建構函式,運算子過載函式不可被繼承(我繼承了你的財產,拿著你的身份證也沒用,上面寫的是基類的名字)。
多型:那麼什麼是多型呢?它建立在繼承的基礎上。
#include
using namespace std;
class shape
intarea()
};class rectangle: public shape
int area ()}
;class ********: public shape
int area ()}
;// 程式的主函式
intmain()
我們是希望通過派生類繼承基類,實現屬於每個派生類獨特的「個性」。我們可以看到,多型的使用往往是為了使父類指標呼叫子類物件。
我們來分析上述**。shape*
是父類指標,它有時想要實現rectangle的方法,有時想實現********的方法。但是當這個指標定義的時候,它自己呼叫建構函式,實現了基類的**area()**方法。
我在學習的時候最大的困惑,為什麼不直接定義派生類,一定要定義父類,再通過多型實現子類的方法呢?
我經過搜尋找到了乙個例子。就是乙個函式,它根據一些條件判斷,它可能返回********,可能返回rectangle,那麼在函式的使用的時候,我們需要有變數去承接函式的返回結果,那麼這個變數我們只知道它一定是shape的子類,所以就有了父類指標呼叫子類方法。如上述shape = &tri
這種情況。
那麼我們如何實現多型呢?
class shape
// pure virtual function
virtual int
area()
=0;}
;
在我們想要不同的實現方法的函式前面加乙個virtual就好啦,這樣的函式定義為是虛函式。
什麼是靜態多型,靜態多型就是在編譯過程中就已經確定好型別的靜態鏈結。
通過虛函式使用,我們只有在程式執行的過程中才能知道其正確的型別
所以,動態和靜態的區別。靜態就像我們剛了解繼承的時候理解的,子類繼承父類的函式,相當於函式過載。當想使用子類的方法,就通過子類來呼叫。實現多型性。
而動態像我上面提到的例子,我們無法確定乙個類是什麼類別,這樣的呼叫通常包括隱式型別轉換。需要用到虛函式,通過父類指標實現子類方法。
順便說一下虛函式表的概念。動態多型,我們說過父類指標實現子類的方法。但是父類指標型別指向的是父類例項的位址,如果想要實現子類的方法,就要去找到子類的方法的位址
所以在父類例項中會有一張虛函式表,虛函式表中儲存的是實現各個動態多型的子類方法的位址。也就是說shape指向了shape例項的位址,裡面是基類的方法位址和成員變數位址,如果shape要實現rec或者tri的方法,就要去虛函式表中找,他們對應的方法的位址。
C 多型 靜態多型與動態多型
多型 顧名思義,多型就是多種形態,也就是對不同物件傳送同乙個訊息,不同物件會做出不同的響應。並且多型分為靜態多型和動態多型。靜態多型就是在系統編譯期間就可以確定程式執行到這裡將要執行哪個函式,例如 函式的過載,物件名加點操作符執行成員函式等,都是靜態多型,其中,過載是在形成符號表的時候,對函式名做了...
靜態多型 動態多型
又稱編譯期多型,即在系統編譯期間就可以確定程式將要執行哪個函式。例如 函式過載,通過類成員運算子指定的運算。函式過載示例 class a a int x void f void f int x class b void f void f int x 以上,類a中兩個a 是函式過載,兩個f 是函式過載...
C 多型技術 靜態多型和動態多型
多型 polymorphism 一詞最初 於希臘語polumorphos,含義是具有多種形式或形態的情形。在程式設計領域,乙個廣泛認可的定義是 一種將不同的特殊行為和單個泛化記號相關聯的能力 和純粹的物件導向程式設計語言不同,c 中的多型有著更廣泛的含義。除了常見的通過類繼承和虛函 數機制生效於執行...