程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 虛函數和抽象基類的應用

虛函數和抽象基類的應用

編輯:關於C

 

<span style="font-size:24px;">/*這個實例是對一個典型例子的改寫。在程序中使用虛函數和抽象基類。類的層次結構是抽象基類Shape(形狀)。Point(點),Circle(圓),Cylinder(圓柱體)都是Shape類的直接派生類和間接派生類*/ 

 

 

//下面是一個完整的程序,為了便於閱讀,分段插入了一些文字說明。  

 

程序如下: 

第(1)部分 

 

#include <iostream>  

using namespace std; 

//聲明抽象基類Shape  

class Shape 

public: 

virtual float area( )const {return 0.0;}//虛函數  

virtual float volume()const {return 0.0;}//虛函數  

virtual void shapeName()const =0;//純虛函數  

}; 

 

 

第(2)部分 

//聲明Point類  

class Point:public Shape//Point是Shape的公用派生類  

public: 

Point(float=0,float=0); 

 

void setPoint(float ,float ); float getX( )const {return x;}float getY( )const {return y;} 

 

virtual void shapeName( )const {cout<<″Point:″;}//對虛函數進行再定義  

 

friend ostream & operator <<(ostream &,const Point &); 

protected: 

float x,y; 

}; 

 

//定義Point類成員函數  

Point::Point(float a,float b) 

{x=a;y=b;} 

 

void Point::setPoint(float a,float b) 

{x=a;y=b;} 

 

ostream & operator <<(ostream &output,const Point &p) 

{     output<<″[″<<p.x<<″,″<<p.y<<″]″; 

return output; 

 

 

第(3)部分 

//聲明Circle類  

class Circle:public Point 

public: 

Circle(float x=0,float y=0,float r=0); 

 

void setRadius(float ); 

 

float getRadius( )const; 

 

virtual float area( )const; 

 

virtual void shapeName( )const {cout<<″Circle:″;}//對虛函數進行再定義  

 

friend ostream &operator <<(ostream &,const Circle &); 

protected : 

float radius; 

}; 

 

 

//聲明Circle類成員函數  

Circle::Circle(float a,float b,float r):Point(a,b),radius(r){} 

 

void Circle::setRadius(float r):radius(r){} 

 

float Circle::getRadius( )const {return radius;} 

 

float Circle::area( )const {return 3.14159*radius*radius;} 

 

ostream &operator <<(ostream &output,const Circle &c){output<<″[″<<c.x<<″,″<<c.y<<″], r=″<<c.radius; 

return output;} 

 

 

 

第(4)部分 

//聲明Cylinder類  

class Cylinder:public Circle 

public: 

Cylinder (float x=0,float y=0,float r=0,float h=0); 

 

void setHeight(float ); 

 

virtual float area( )const; 

 

virtual float volume( )const; 

 

virtual void shapeName( )const {cout<<″Cylinder:″;}//對虛函數進行再定義  

 

friend ostream& operator <<(ostream&,const Cylinder&); 

protected: 

float height; 

}; 

 

//定義Cylinder類成員函數  

Cylinder::Cylinder(float a,float b,float r,float h):Circle(a,b,r),height(h){} 

 

void Cylinder::setHeight(float h){height=h;} 

 

float Cylinder::area( )const{return 2*Circle::area( )+2*3.14159*radius*height;} 

 

float Cylinder::volume( )const{return Circle::area( )*height;} 

 

ostream &operator <<(ostream &output,const Cylinder& cy) 

{     output<<″[″<<cy.x<<″,″<<cy.y<<″], r=″<<cy.radius<<″, h=″<<cy.height; return output;} 

 

 

第(5)部分 

//main函數  

int main( ) 

Point point(3.2,4.5);//建立Point類對象point  

Circle circle(2.4,1.2,5.6); 

//建立Circle類對象circle  

Cylinder cylinder(3.5,6.4,5.2,10.5); 

//建立Cylinder類對象cylinder  

point.shapeName(); 

//靜態關聯  

cout<<point<<endl; 

circle.shapeName();//靜態關聯  

cout<<circle<<endl; 

cylinder.shapeName();//靜態關聯  

cout<<cylinder<<endl<<endl; 

Shape *pt;//定義基類指針  

pt=&point;//指針指向Point類對象  

pt->shapeName( );//動態關聯  

cout<<″x=″<<point.getX( )<<″,y=″<<point.getY( )<<″\\narea=″<<pt->area( ) 

<<″\\nvolume=″<<pt->volume()<<″\\n\\n″; 

pt=&circle;//指針指向Circle類對象  

pt->shapeName( );//動態關聯  

cout<<″x=″<<circle.getX( )<<″,y=″<<circle.getY( )<<″\\narea=″<<pt->area( ) 

<<″\\nvolume=″<<pt->volume( )<<″\\n\\n″; 

pt=&cylinder;//指針指向Cylinder類對象  

pt->shapeName( );//動態關聯  

cout<<″x=″<<cylinder.getX( )<<″,y=″<<cylinder.getY( )<<″\\narea=″<<pt->area( ) 

<<″\\nvolume=″<<pt->volume( )<<″\\n\\n″; 

return 0;} 

 

 

 

 

程序運行結果如下。 

請讀者對照程序分析。 

Point:[3.2,4.5](Point類對象point的數據:點的坐標) 

Circle:[2.4,1.2], r=5.6 (Circle類對象circle的數據:圓心和半徑) 

Cylinder:[3.5,6.4], r=5.5, h=10.5 (Cylinder類對象cylinder的數據: 圓心、半徑和高) 

Point:x=3.2,y=4.5 (輸出Point類對象point的數據:點的坐標) 

area=0 (點的面積) 

volume=0 (點的體積) 

Circle:x=2.4,y=1.2 (輸出Circle類對象circle的數據:圓心坐標) 

area=98.5203 (圓的面積) 

volume=0 (圓的體積) 

Cylinder:x=3.5,y=6.4 (輸出Cylinder類對象cylinder的數據:圓心坐標) 

area=512.595 (圓的面積) 

volume=891.96 (圓柱的體積) 

 

 

 

 

從本例可以進一步明確以下結論: 

/*(1)一個基類如果包含一個或一個以上純虛函數,就是抽象基類。

抽象基類不能也不必要定義對象。

(2)抽象基類與普通基類不同,它一般並不是現實存在的對象的抽象(例如圓形(Circle)就是千千萬萬個實際的圓的抽象),它可以沒有任何物理上的或其他實際意義方面的含義。

(3)在類的層次結構中,頂層或最上面的幾層可以是抽象基類。

抽象基類體現了本類族中各類的共性,把各類中共有的成員函數集中在抽象基類中聲明。

(4)抽象基類是本類族的公共接口。

或者說,從同一基類派生出的多個類有同一接口。

(5)區別靜態關聯和動態關聯。

(6)如果在基類聲明了虛函數,則在派生類中凡是與該函數有相同的函數名、函數類型、參數個數和類型的函數,均為虛函數(不論在派生類中是否用virtual聲明)。

(7)使用虛函數提高了程序的可擴充性。

把類的聲明與類的使用分離。

這對於設計類庫的軟件開發商來說尤為重要。

開發商設計了各種各樣的類,但不向用戶提供源代碼,用戶可以不知道類是怎樣聲明的,但是可以使用這些類來派生出自己的類。

利用虛函數和多態性,程序員的注意力集中在處理普遍性,而讓執行環境處理特殊性。

多態性把操作的細節留給類的設計者(他們多為專業人員)去完成,而讓程序人員(類的使用者)只需要做一些宏觀性的工作,告訴系統做什麼,而不必考慮怎麼做,極大地簡化了應用程序的編碼工作,大大減輕了程序員的負擔,也降低了學習和使用C++編程的難度,使更多的人能更快地進入C++程序設計的大門。*/ 

 

摘自 wwj的夢想之路

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved