查看文章 |
2)编写一个程序计算正方形、球体和圆柱体的表面积和体积。 分析:依题意,抽象出一个公共基类CContaineer为抽象类,在其中定义求表面积和体积的虚函数(该抽象类本身没有表面积和体积可言)。抽象类中定义一个公共的数据成员radius,此数据可作为球体的半径、正方形的边长、圆柱体底面积圆半径。由此抽象类派生出要描述的三个类,在这三个类中都具有求表面积和体积的重定义版本。 源程序如下: #include<iostream.h> class CCt //定义抽象类CContaineer {protected: float radius; //公共的数据成员radius double area,volume; //表面积area,体积volume public: virtual void Area()=0; //求表面积的纯虚函数 virtual void Volume()=0; //求体积的纯虚函数 CCt (floata,double b,double c){radius=a;area=b;volume=c;} //基类的构造函数 }; class Square:public CCt //派生类Square { public: Square(float a,double b,double c): CCt (a,b,c) {} void Area() //虚函数Area() {area=6*radius*radius; cout<<"Square's area="<<area<<endl; } void Volume() //虚函数Volume () {volume=radius*radius*radius; cout<<" Square's volume="<<volume<<endl;} }; class circle:public CCt //派生类circle { public: circle(float a,double b,double c): CCt (a,b,c) {} //派生类circle构造函数 void Area() {area=4*3.14*radius*radius; cout<<"circle's area="<<area<<endl; } void Volume() {volume=3.14*radius*radius*radius*4/3; cout<<" circle's volume="<<volume<<endl;} }; class CCt linder:public CCt //派生类CCt linder {float high; public: CCt linder(float h,float r,double a,double v): CCt (r,a,v) {high=h;} void Area() //派生类CCtlinder的虚函数定义 {area=2*3.14*radius*radius+2*3.14*radius*high; cout<<" CCt linder's area="<<area<<endl; } void Volume() { volume=3.14*radius*radius*high; cout<<" CCt 's volume="<<volume<<endl;} };
void Areafun(CCt *p)//根据p所指向的对象不同,调用 不同的派生类Area {p->Area();} void Volumefun(CCt *p) //根据p所指向的对象不同,调用不同的派生类Volume {p->Volume();} void main() {Square r1(5,0,0);// Square的对象r1 circle c1(8,0,0); // circle的对象c1 CCt linder cc2(2,14,0,0); // CCt linde的对象cc2 Areafun(&r1);//调用的将是派生类Square的Area虚函数 Volumefun(&r1);// 调用的将是派生类Square的Volume虚函数 Areafun(&c1); Volumefun(&c1); Areafun(&cc2); Volumefun(&cc2); }运行结果: Square's area=150 Square's volume=125 circle's area=803.84 circle's volume=2143.57 CCt 's area=1406.72 CCt 's volume=1230.88 Press any key to continue 总结:通过实验,初步掌握了虚函数、纯虚函数和抽象类的定义和使用。 |