C++:純虛擬函式與抽象類

weixin_34391854發表於2015-10-26

5.4.3 純虛擬函式和抽象類

純虛擬函式是一個在基類中說明的虛擬函式,它在該基類中沒有定義,但是要求在派生類中根據需要對它進行定義,或仍然說明為純虛擬函式。


宣告純虛擬函式的一般格式是:
virtual 函式型別 函式名(參數列)=0;

純虛擬函式的作用是:在基類中為其派生類保留一個函式的名字,以便派生類根據需要對它進行重新定義。純虛擬函式沒有函式體,它最後面“=0 ”並不表示函式的返回值是0,它只是形式上的作用,告訴編譯系統這是純虛擬函式。純虛擬函式不具有函式的功能,不能被呼叫。

//應用舉例

#include<iostream>
using namespace std;
#define PI 3.14 
class Circle{                   //基類(抽象類) 
  public: 
   void setradius(double r)
   {
    radius = r;
   } 
   virtual void show()=0;        //在基類裡定義純虛擬函式 
  protected:
   double radius;  
};
class Area:public Circle{
  public:
    void show()                 //在派生類Area中重新定義虛擬函式函式show 
    {
     cout<<"圓的面積是:"<<PI*radius*radius<<endl;
    }
};
class Perimeter:public Circle{
  public:
    void show()                 //在派生類Perimeter中重新定義虛擬函式函式show 
    {
     cout<<"圓的周長是:"<<2*PI*radius<<endl;
    }
};
int main()
{
 Circle *ptr;           //定義(抽象類)基類circle物件指標ptr
 Area a;               //定義Area物件a
 a.setradius(10);
 ptr=&a;
 ptr->show(); 
 Perimeter p;          //定義Perimeter物件p
 p.setradius(10);
 ptr=&p;
 ptr->show();
 return 0; 
}

程式執行結果:
圓的面積是:314
圓的周長是:62.8

在以上例子中,Circle是一個基類,它表示一個圓。從它可以派生出面積類Area和周長類Perimeter。顯然,基類中定義的show函式是沒有任何意義的,它只是用來提供派生類使用的公共介面,所以在程式中將其定義為純虛擬函式,但在派生類中,則根據程式的需要,具體地重新定義純虛擬函式。如果一個類至少有一個純虛擬函式,那麼就稱為這個類為抽象類。因此,上述程式中定義的類Circle就是一個抽象類。對於抽象類的使用有以下幾點規定:

(1)由於抽象類中至少包含有一個沒有定義功能的純虛擬函式,因此抽象類只能用其他類的基類,不能建立抽象類的物件。


(2)抽象類不能用作引數型別、函式返回型別或顯式轉換的型別。但是可以宣告指向抽象類的的指標變數,此指標可以指向它的派生類,進而實現多型性。


(3)如果在抽象類的派生類中沒有重新說明純虛擬函式,則該函式在派生類中仍然為純虛擬函式,而這個派生類仍然還是一個派生類。

相關文章