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)如果在抽象類的派生類中沒有重新說明純虛擬函式,則該函式在派生類中仍然為純虛擬函式,而這個派生類仍然還是一個派生類。