好无聊的 C++作业,虽然是练熟练度的,但是好歹也出个有点意思的题目吧... #include <iostream.h> /*关于运算符重载,完全定义六个类之间的四则运算实在是太耗费时间了,只定义了 圆加上点,圆心与点坐标相加 圆减去正方形,圆半径减去正方形边长 圆乘以矩形,圆半径乘以矩形长 其他的情况可以直接参考已重载的运算符稍加修改即可 在main函数最后输出运算结果*/ //先对定义的5个派生类进行声明,以便在重载运算符时使用 class Circle; class Square; class Rectangle; class Trapezoid; class Triangle; class Shape //构造抽象类 { public: virtual void shape_name()=0; //构造纯虚函数,输出形状名字 virtual double area()=0; //构造纯虚函数,输出面积 }; class Point:public Shape //构造Shape的派生类Point,点 { public: Point(double a = 0,double b = 0); //声明有默认值的构造函数 virtual void shape_name(){cout<<"Point:";} virtual double area(); friend Circle operator + (Circle &c1,Point &p1); protected: double x,y; //定义x和y }; Point::Point(double a,double b):x(a),y(b){} //构造函数初始化列表 double Point::area() //定义Point类中的面积函数 { return 0; } class Circle:public Point //构造Point的派生类Circle,圆 { public: Circle(double a= 0,double b = 0,double r = 0); //声明构造函数 void shape_name(){cout<<"Circle:";} double area(); friend ostream & operator << (ostream &,Circle &); friend Circle operator + (Circle &c1,Point &p1); friend Square operator - (Circle & c2,Square & s2); friend Rectangle operator * (Circle & c3,Rectangle & r3); protected: double radius; //定义半径radius }; Circle::Circle(double a,double b,double r):Point(a,b),radius(r){} //构造函数初始化列表 double Circle::area() //定义输出圆的面积函数 { return 2*radius*3.14159; } Circle operator + (Circle &c1,Point &p1) //定义Circle+Point运算符 { return p1.x+c1.x,p1.y+c1.y; } ostream & operator << (ostream & output,Circle & c1) //重载<<运算符,实现对Circle的输出 { output<<"["<<c1.x<<","<<c1.y<<"],radius = "<<c1.radius; return output; } class Square:public Point //构造Point的派生类Square,正方形 { public: Square(double a = 0,double b = 0,double s = 0); void shape_name(){cout<<"Square:";} double area(); friend Square operator - (Circle & c2,Square & s2); friend ostream & operator << (ostream &,Square &); protected: double side; //定义边长 }; Square::Square(double a,double b,double s):Point(a,b),side(s){} double Square::area() { return side*side; } Square operator - (Circle & c2,Square & s2) //定义Circle-Square { return c2.radius - s2.side; } ostream & operator << (ostream & output,Square & s1) //重载<<运算符,实现对Square的输出 { output<<"["<<s1.x<<","<<s1.y<<"],side = "<<s1.side; return output; } class Rectangle:public Point //构造Point的派生类Rectangle,距形 { public: Rectangle(double a = 0,double b = 0,double w = 0,double l = 0); void shape_name(){cout<<"Rectangle:";} double area(); friend Rectangle operator * (Circle & c3,Rectangle & r3); friend ostream & operator << (ostream &,Rectangle &); protected: double width,length; //定义宽度,长度 }; Rectangle::Rectangle(double a,double b,double w,double l):Point(a,b),width(w),length(l){} double Rectangle::area() { return width*length; } Rectangle operator * (Circle & c3,Rectangle & r3) //定义Circle*Rectangle { return c3.radius * r3.length; } ostream & operator << (ostream & output,Rectangle & r1) //重载<<运算符,实现对Square的输出 { output<<"["<<r1.x<<","<<r1.y<<"], length = "<<r1.length<<",width = "<<r1.width; return output; } class Trapezoid:public Point //构造Point的派生类Trapezoid,梯形 { public: Trapezoid(double a = 0,double b = 0,double u = 0,double un = 0,double h = 0); void shape_name(){cout<<"Trapezoid:";} double area(); protected: double up_side,under_side,high; //定义上底,下底,高 }; Trapezoid::Trapezoid(double a,double b,double u,double un,double h):Point(a,b),up_side(u),under_side(un),high(h){} double Trapezoid::area() { return (up_side+under_side)*high/2; } class Triangle:public Point //构造Point的派生类Triangle,三角形 { public: Triangle(double a = 0,double b = 0,double ts= 0,double th = 0); void shape_name(){cout<<"Triangle:";} double area(); protected: double tside,thigh; //定义三角形底和高 }; Triangle::Triangle(double a,double b,double ts,double th):Point(a,b),tside(ts),thigh(th){} double Triangle::area() { return tside*thigh/2; } int main() { //定义对象,初始化赋值 Point dian(0,0); Circle yuan(0,0,10); Square zheng_fang(0,0,6); Rectangle jv_xing(0,0,7,8); Trapezoid ti_xing(0,0,7,8,6); Triangle san_jiao(0,0,5,6); //定义基类指针数组 Shape *pt[6]={&dian,&yuan,&zheng_fang,&jv_xing,&ti_xing,&san_jiao}; double areas=0.0; for(int i = 0;i != 6;++i) { pt[i]->shape_name(); //输出形状名称 cout<<pt[i]->area()<<endl; //输出形状面积,换行 areas+=pt[i]->area(); //累加 } cout<<"the sum is:"<<areas<<endl; //输出面积总和 cout<<endl; cout<<(yuan+dian)<<endl; //圆和点相加 cout<<(yuan-zheng_fang)<<endl; //圆减去正方形 cout<<(yuan*jv_xing)<<endl; //圆乘上矩形 return 0; }