虚函数和抽象基类的应用 Point(点),Circle(圆),Cylinder (圆柱体) |
|
发起人:piaoling 回复数:2 浏览数:8930 最后更新:2009/12/11 17:09:31 by piaoling |
选择查看 | 搜索更多相关主题 帖子排序: |
piaoling 发表于 2009/11/22 16:18:01
|
虚函数和抽象基类的应用 Point(点),Circle(圆),Cylinder (圆柱体) 在本章例1介绍了以Point为基类的点一圆一圆柱体类的层次结构。现在要对它 进行改写,在程序中使用虚函数和抽象基类。类的层次结构的顶层是抽象基类Shape(形 状)。Point(点),Circle(圆),Cylinder (圆柱体)都是Shape类的直接派生类和间接派生类,下面是一个完整的程序,程序如下:
第(1)部分
Point从Shape继承了3个成员函数,由于“点”是没有面积和体积的,因此不必重新定义area和volume。虽然在Point类中用不到这两个函数,但是Point类仍然从Shape类继承了这两个函数,以便其派生类继承它们。shapeName函数在Shape类中是纯虚函数,在Point类中要进行定义。Point类还有自己的成员函数(setPoint,getX,getY)和数据成员(x和y)。
在Circle类中要重新定义ama函数,因为需要指定求圆面积的公式。由于圆没有体积,因此不必重新定义volume函数,而是从Point类继承volume函数。shapeName函数是虚函数,需要重新定义,赋予新的内容(如果不重新定义,就会继承Point类中的shapeName函数)。此外,Circle类还有自己新增加的成员函数(setRadius,getRadius)和数据成员(radius)。
Cylinder类是从Circle类派生的。由于圆柱体有表面积和体积,所以要对afea和volume函数重新定义。虚函数shapeName也需要重新定义。此外,Cylinder类还有自己的成员函数setHeight和数据成员radius。 第(5)部分
运行结果:
从本例可以进一步明确以下结论: 1、一个基类如果包含一个或一个以上纯虚函数,就是抽象基类。 |
piaoling 发表于 2009/12/11 15:07:40
|
#include<iostream> class Rectangle:public Shape //矩形 Rectangle class Triangle:public Shape //Triangle(三角形) |
piaoling 发表于 2009/12/11 17:09:31
|
#include<iostream> #include<math.h> using namespace std; class Base //抽象基类 Shape { public: virtual double area()=0; //计算输出图形面积 virtual void shape()=0; //描述图形的名称 }; class Circle:public Base //圆形 Circle { public: Circle(double r){radius=r;} void shape(){cout<<"Circle: ";} double area(){return 3.14*radius*radius;} private: double radius; }; class Square:public Base //正方形 square { public: Square(double a){sidea=a;} void shape(){cout<<"Square: ";} double area(){return sidea*sidea;} private: double sidea; }; class Rectangle:public Base //矩形 Rectangle { public: Rectangle(double a,double b){sidea=a;sideb=b; } void shape(){cout<<"Rectangle: ";} double area(){return sidea*sideb;} private: double sidea; double sideb; }; class Trapezoid:public Base //梯形 Trapezoid { public: Trapezoid(double a,double b,double h){sidea=a;sideb=b;sideh=h; } void shape(){cout<<"Trapezoid: ";} double area(){return (sidea+sideb)*sideh/2;} private: double sidea; double sideb; double sideh; }; class Triangle:public Base //Triangle(三角形) { public: Triangle(double a,double b,double c){sidea=a;sideb=b;sidec=c;} void shape(){cout<<"Triangle: ";} double area() { double s=(sidea+sideb+sidec)/2; double m=s*(s-sidea)*(s-sideb)*(s-sidec); return sqrt(m); } private: double sidea; double sideb; double sidec; }; int main() { Circle C1(8.4); Square S1(3.18); Rectangle R1(6.34,8.64); Trapezoid T1(2.5,5,4); Triangle T2(4.54,5.13,3.89); Base *pt[5];
pt[0]=&C1; pt[0]->shape(); cout << pt[0]->area()<<endl; pt[1]=&S1; pt[1]->shape(); cout << pt[1]->area()<<endl;
pt[2]=&R1; pt[2]->shape(); cout << pt[2]->area()<<endl; pt[3]=&T1; pt[3]->shape(); cout << pt[3]->area()<<endl;
pt[4]=&T2; pt[4]->shape(); cout << pt[4]->area()<<endl;
system("pause"); return 0; } |
返回页首↑ |