問題及代碼:
/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*文件名稱:project.cpp
*作 者:陳文青
*完成日期:2015年6月6日
*版 本 號:v1.0
*
*問題描述:設計一個抽象類CSolid,含有用於求表面積及體積的兩個純虛函數。
設計派生類CCube、CBall、CCylinder,分別表示正方體、球體及圓柱體。
在main()函數中,定義CSolid *p;(p是指向基類的指針,且這個基類是個抽象類)。
要求利用這個p指針,能夠求出正方體、球體及圓柱體對象的表面積及體積。
*程序輸入:
*程序輸出:
*/
#include<iostream>
using namespace std;
//定義虛基類
class CSolid
{
public:
virtual double get_area() =0; //關於表面積的純虛函數
virtual double get_volume() =0; //關於體積的純虛函數
};
//定義正方體類
class CCube:public CSolid
{
public:
CCube(double l=0,double w=0,double h=0):length(l),width(w),height(h) {} //長方體類的構造函數
double get_area()
{
return 2*(length*width+length*height+width*height);
}
double get_volume()
{
return length*width*height;
}
protected:
double length; //長
double width; //寬
double height; //高
};
//定義球體類
class CBall:public CSolid
{
public:
CBall(double r=0):radius(r) {} //球體的構造函數
double get_area()
{
return 4*3.14*radius*radius;
}
double get_volume()
{
return 4/3*3.14*radius*radius*radius;
}
protected:
double radius; //半徑
};
//定義圓柱體類
class CCylinder:public CSolid
{
public:
CCylinder(double r=0,double h=0):radius(r),height(h) {} //圓柱的構造函數
double get_area()
{
return 3.14*radius*radius*2+2*3.14*radius*height;
}
double get_volume()
{
return 3.14*radius*radius*height;
}
protected:
double radius; //地面半徑
double height; //高
};
//測試函數
int main()
{
double s,v; //表示表面積和體積
CSolid *p; //指向基類的指針
CCube a(1,1,1);
cout<<"長方體的長:1\t寬:1\t高:1"<<endl;
p=&a; //指向長方體的對象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面積:"<<s<<endl;
cout<<"體積:"<<v<<endl<<endl;
CBall b(1);
cout<<"球的半徑:1"<<endl;
p=&b; //指向球的對象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面積:"<<s<<endl;
cout<<"體積:"<<v<<endl<<endl;
CCylinder c(1,1);
cout<<"圓柱體的底面半徑:1\t高:1"<<endl;
p=&c; //指向圓柱的對象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面積:"<<s<<endl;
cout<<"體積:"<<v<<endl<<endl;
return 0;
}
運行結果:
知識點總結:
抽象類的定義: virtual 加上 =0;
只有繼承虛函數,並覆蓋了同名的虛函數,纔可以利用指向基類的指針自由指向派生類的同名成員函數,實現動態多態性