天天看點

C++引入抽象基類和純虛函數的作用和目的為什麼要引入抽象基類和純虛函數?主要目的是為了實作一種接口的效果。

為什麼要引入抽象基類和純虛函數?

主要目的是為了實作一種接口的效果。

  原文連結:https://blog.csdn.net/weibo1230123/article/details/82014322

抽象類是一種特殊的類,它是為了抽象和設計的目的為建立的,它處于繼承層次結構的較上層。

      ⑴抽象類的定義:帶有純虛函數的類為抽象類。

      ⑵抽象類的作用:

      抽象類的主要作用是将有關的操作作為結果接口組織在一個繼承層次結構中,由它來為派生類提供一個公共的根,派生類将具體實作在其基類中作為接口的操作。是以派生類實際上刻畫了一組子類的操作接口的通用語義,這些語義也傳給子類,子類可以具體實作這些語義,也可以再将這些語義傳給自己的子類。

      (3)使用抽象類時注意:

    抽象類隻能作為基類來使用,其純虛函數的實作由派生類給出。如果派生類中沒有重新定義純虛函數,而隻是繼承基類的純虛函數,則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛函數的實作,則該派生類就不再是抽象類了,它是一個可以建立對象的具體的類。

    抽象類是不能定義對象的。

一、純虛函數定義

 純虛函數是一種特殊的虛函數,它的一般格式如下:

  class <類名>

  {

  virtual <類型><函數名>(<參數表>)=0;

  …

  };

  在許多情況下,在基類中不能對虛函數給出有意義的實作,而把它聲明為純虛函數,它的實作留給該基類的派生類去做。這就是純虛函數的作用。

  純虛函數可以讓類先具有一個操作名稱,而沒有操作内容,讓派生類在繼承時再去具體地給出定義。凡是含有純虛函數的類叫做抽象類。這種類不能聲明對象,隻是作為基類為派生類服務。除非在派生類中完全實作基類中所有的的純虛函數,否則,派生類也變成了抽象類,不能執行個體化對象。

二、純虛函數引入原因

    1、為了友善使用多态特性,我們常常需要在基類中定義虛拟函數。

  2、在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔 雀等子類,但動物本身生成對象明顯不合常理。

  為了解決上述問題,引入了純虛函數的概念,将函數定義為純虛函數(方法:virtual ReturnType Function()= 0;)。若要使派生類為非抽象類,則編譯器要求在派生類中,必須對純虛函數予以重載以實作多态性。同時含有純虛函數的類稱為抽象類,它不能生成對象。這樣就很好地解決了上述兩個問題。

         例如,繪畫程式中,shape作為一個基類可以派生出圓形、矩形、正方形、梯形等, 如果我要求面積總和的話,那麼會可以使用一個 shape * 的數組,隻要依次調用派生類的area()函數了。如果不用接口就沒法定義成數組,因為既可以是circle ,也可以是square ,而且以後可能加上rectangle,等等.

三、相似概念

      1、多态性  指相同對象收到不同消息或不同對象收到相同消息時産生不同的實作動作。C++支援兩種多态性:編譯時多态性,運作時多态性。  a.編譯時多态性:通過重載函數實作  b 運作時多态性:通過虛函數實作。  2、虛函數  虛函數是在基類中被聲明為virtual,并在派生類中重新定義的成員函數,可實作成員函數的動态重載  3、抽象類

  包含純虛函數的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數,是以不能定義抽象類的對象。

四、其他

重載是不是多态?

第一種說法

  重載是一種是多态(如C++),有四種形式的多态:

  1.虛函數多态

  2模闆多态

  3重載

  4轉換

  所謂的動态和靜态區分是另一種基于綁定時間的多态分類,嚴格來說,重載是編譯時多态,即靜态多态,根據不同類型函數編譯時會産生不同的名字如int_foo和char_foo等等,以此來差別調用。故重載仍符合多态定義——通過單一辨別支援不同特定行為的能力,隻是重載屬于靜态多态,而不是通過繼承和虛函數實作的動态多态。

第二種說法

  重載(overload)和多态無關,真正和多态相關的是覆寫(override)。

  當派生類重新定義了基類的虛拟方法後,基類根據賦給它的不同的派生類引用,動态地調用屬于派生類的對應方法,這樣的方法調用在編譯期間是無法确定的。是以,這樣的方法位址是在運作期綁定的(動态綁定)。

  重載隻是一種語言特性,是一種文法規則,與多态無關,與面向對象也無關。

  不過針對所謂的第二種重載,有一個專門的名詞--重寫或重定義。重載與重寫的差別就在于是否覆寫,重寫一般多發生在不同的類且存在繼承關系之間,而重載多是在一個類裡或者一塊代碼段裡。

C++中的重載

  函數重載:

  函數重載就是函數名稱相同,但定義卻不同。函數重載使得程式員可以将一系列的函數族定義為一個統一的界面,但是卻可以處理不同類型資料或接受不同個數的參數。這實作了統一接口,不同定義的思想。

  流的重載:

  C++的流提取運算符>>和就插入運算符<<是C++類庫提供的輸入輸出(I/O)操作符。系統與定義了輸入流類istream和輸出流類ostream,cin和cout分别是istream和ostream的對象。iostream頭檔案中已經對>>和<<進行了重載,使得它能用來輸入/輸出标準類型的資料。但如果是自己定義類型,就需要重載在這兩個運算符,以便它們能輸入/上歲數出該自定義類型。格式如下:

  流插入的重載:ostream &operator<<(ostream &,自定義類 &);

  流提取的重載:istream &operator>>(istream &,自定義類 &);

  運算符的重載:

  運算符的重在就是對運算符的重新定義,即一個運算符可以用于多種資料類型的運算中。運算符的重載在實際程式設計中使用很普遍,例如,“+”運算符既可以用于整數加,也可以用于浮點加,甚至是字元串的連結。格式如下:

  type operator sign (參數清單);

為什麼要引入抽象基類和純虛函數?

主要目的是為了實作一種接口的效果。

  原文連結:https://blog.csdn.net/weibo1230123/article/details/82014322

繼續閱讀