<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的夢想之路