純虛函數

定義

純虛函數就是在基類中聲明的虛函數,它在基類中沒有定義,但要求任何派生類都要定義本身的實現方法。在基類中實現純虛函數的方法是在函數原型後面加「=0」函數

引入緣由

  • 方便的使用多態,所以經常在基類中定義虛函數
  • 在不少狀況下,基類自己生成對象是不合理的。例如,動物做爲一個基類能夠派生出老虎、孔雀等子類,蛋動物自己生成對象明顯不合常理。

爲了解決上述問題,引入了純虛函數的概念,將函數定義爲純虛函數(virtual ReturnType Function() = 0),則編譯器要求在派生類中必須予以重寫以實現多態性。
含有純虛函數的類稱爲抽象類,它不能生成對象。
聲明瞭純虛函數的類是一個抽象類,因此,用戶不能建立類的實例,只能建立它的派生類的實例。
純虛函數最顯著的特徵是:它們必須在繼承類總從新聲明函數(不要後面的=0,不然該派生類也不鞥實例化),並且它們在抽象類中每每沒有定義。
定義純虛函數的目的在於,使派生類僅僅只是繼承函數的接口。
純虛函數的意義在於,讓全部的類對象(主要是派生類對象)均可以執行純虛函數的動做,但類沒法爲純虛函數提供一個合理的缺省實現。因此,純虛函數的聲明就是在告訴子類的設計者,「你必須提供一個純虛函數的實現,但我不知道你會怎樣實現它」
抽象類的介紹設計

抽象類是一種特殊的類,它是爲了抽象和設計的目的而創建的,它處於繼承層次結構的較上層。
抽象類的定義:
稱帶有純虛函數的類爲抽象類
抽象類的做用
抽象類的主要做用是將有關的操做做爲結果接口組織在一個繼承層次結構中,由它來爲派生類提供一個公共的根,派生類將具體實如今其基類中做爲藉口的操做。
因此派生類實際上刻畫了一組子類的操做接口的通用語義,這些語義也傳給子類,子類能夠具體實現這些語義,也能夠再將這些語義傳給本身的子類。指針

使用抽象類時注意:對象

  • 抽象類只能做爲基類來使用,其純虛函數的實現由派生類給出。若是派生類中沒有從新定義純虛函數,而只是繼承基類的純虛函數,則這個派生類仍然是一個抽象類。若是派生類中給出了基類純虛函數的實現,則該派生類就再也不是抽象類了,它是一個能夠創建對象的具體的類。
  • 抽象類是不能定義對象的。

純虛函數和虛函數有什麼區別

  • 純虛函數聲明以下:virtual void function1()=0;
    純虛函數必定沒有定義,純虛函數用來規範派生類的行爲, 即接口。包含純虛函數的類是抽象類,抽象類不能定義實例,但能夠聲明指向實現該抽象類的具體類的指針或引用。
  • 虛函數的聲明以下:virtual void function(parameter);
    虛函數必須實現,若是不實現,編譯器將報錯。
  • 對於虛函數來講,父類和子類都有各自的版本。由多態方式調用的時候動態綁定。
  • 實現了純虛函數的子類,該純虛函數在子類中就變成了了虛函數,子類的子類能夠覆蓋該虛函數,由多態方式調用的時候動態綁定。
  • 虛函數是C++中用於實現多態的機制。核心理念就是經過基類訪問派生類定義的函數。
  • 在有動態分配堆上內存的時候,析構函數必須是虛函數,但沒有必要是純虛的。
  • 友元不是成員函數,只有成員函數纔可使虛擬的,所以友元不能是虛擬函數。但能夠經過讓友元函數調用虛擬成員函數來解決友元的虛擬問題。
  • 析構函數應當是虛函數,將調用相應對象類型的析構函數。所以,若是指針指向的是子類對象,將調用子類的析構函數,而後自動調用基類的析構函數。
相關文章
相關標籤/搜索