C++中的抽象類、虛函數和純虛函數 c++
abstrct class:在C++中,含有純虛函數的類爲抽象類,不能生成對象;同理JAVA中,抽象類對於提供模式、藍圖和後代遵循的原則有用。 編程
純虛函數和虛函數的區別在於前者不包含定義,後者包含函數體。 函數
虛函數:在某基類中聲明爲virtual並在一個或多個派生類中被從新定義的成員函數。 spa
用途:實現多態(動態綁定),經過指向派生類的基類指針訪問派生類中同名覆蓋成員函數。 設計
若是父類的函數(方法)根本沒有必要或者沒法實現,徹底要依賴子類去實現的話,能夠把此函數(方法)設爲virtual 函數名=0 咱們把這樣的函數(方法)稱爲純虛函數。 指針
爲了支持c++的多態性,才用了動態綁定和靜態綁定。理解他們的區別有助於更好的理解多態性,以及在編程的過程當中避免犯錯誤,須要理解四個名詞:
一、對象的靜態類型:對象在聲明時採用的類型。是在編譯期肯定的。
二、對象的動態類型:目前所指對象的類型。是在運行期決定的。 code
對象的動態類型能夠更改,可是靜態類型沒法更改。關於對象的靜態類型和動態類型,看一個示例: htm
class B { } class C : public B { } class D : public B { } D* pD = new D();//pD的靜態類型是它聲明的類型D*,動態類型也是D* B* pB = pD;//pB的靜態類型是它聲明的類型B*,動態類型是pB所指向的對象pD的類型D* C* pC = new C(); pB = pC;//pB的動態類型是能夠更改的,如今它的動態類型是C*
三、靜態綁定:綁定的是對象的靜態類型,某特性(好比函數)依賴於對象的靜態類型,發生在編譯期。 對象
四、動態綁定:綁定的是對象的動態類型,某特性(好比函數)依賴於對象的動態類型,發生在運行期。 繼承
class B { void DoSomething(); virtual void vfun(); } class C : public B { void DoSomething();//首先說明一下,這個子類從新定義了父類的no-virtual函數,這是一個很差的設計,會致使名稱遮掩;這裏只是爲了說明動態綁定和靜態綁定才這樣使用。 virtual void vfun(); } class D : public B { void DoSomething(); virtual void vfun(); } D* pD = new D(); B* pB = pD;讓咱們看一下,pD->DoSomething()和pB->DoSomething()調用的是同一個函數嗎?
class B { virtual void vfun(int i = 10); } class D : public B { virtual void vfun(int i = 20); } D* pD = new D(); B* pB = pD; pD->vfun(); pB->vfun();有上面的分析可知pD->vfun()和pB->vfun()調用都是函數D::vfun(),可是他們的缺省參數是多少?