类的组合与继承
(1)先建立一个Point(点)类。包括数据成员x,y(坐标点)。
(2)以Point为基类。派生出一个Circle(圆)类,添加数据成员(半径),基类的成员表示圆心;
(3)编写上述两类中的构造、析构函数及必要的输入输出函数
(4)定义友元函数int locate。推断点p在圆c上、圆c内或圆c外。返回值<0圆内,==0圆上,>0 圆外;
(5)重载关系运算符(6种)运算符,使之可以按圆的面积比較两个圆的大小;

程序代码

#include <iostream>
#include <cmath>using namespace std;class Point//点类
{
public://构造函数Point(double a = 0, double b = 0);//得到点的x坐标double GetX();//得到点的y坐标double GetY();//重载<<运算符实现输出点的坐标friend ostream& operator<<(ostream &output, Point &p);protected:double x;double y;
};//构造函数
Point::Point(double a, double b):x(a), y(b){}//得到点的x坐标
double Point::GetX()
{return x;
}//得到点的y坐标
double Point::GetY()
{return y;
}//重载<<运算符实现输出点的坐标
ostream& operator<<(ostream &output, Point &p)
{output<<"("<<p.x<<","<<p.y<<")"<<endl;return output;
}//Point类派生出Circle类
class Circle : public Point
{
public://构造函数Circle(double a = 0, double b = 0, double r = 0);//得到圆的半径double GetR();//推断点p与圆c的位置friend int locate(Point p, Circle c);//计算圆的面积double GetArea();//输出圆的信息friend ostream& operator<<(ostream &output, Circle &c);//重载>运算符,用于比較两个圆的面积的大小friend bool operator>(Circle &c1, Circle &c2);//重载<运算符,用于比較两个圆的面积的大小friend bool operator<(Circle &c1, Circle &c2);//重载==运算符,用于比較两个圆的面积的大小friend bool operator==(Circle &c1, Circle &c2);//重载!=运算符,用于比較两个圆的面积的大小friend bool operator!=(Circle &c1, Circle &c2);//重载>=运算符,用于比較两个圆的面积的大小friend bool operator>=(Circle &c1, Circle &c2);//重载<=运算符,用于比較两个圆的面积的大小friend bool operator<=(Circle &c1, Circle &c2);protected:double r;//半径
};//构造函数
Circle::Circle(double a, double b, double r):Point(a, b), r(r){}//得到圆的半径
double Circle::GetR()
{return r;
}//得到圆的面积
double Circle::GetArea()
{return 3.14 * r * r;
}//推断点p与圆c的位置
int locate(Point p, Circle c)
{double d;//保存点到圆心的距离double r;//保存圆的半径double flag;//标示位//计算点到圆心的距离d = sqrt((p.GetX() - c.GetX()) * (p.GetX() - c.GetX()) + (p.GetY() - c.GetY()) * (p.GetY() - c.GetY()));//得到圆的半径r = c.GetR();if(d > r )//点在圆外{flag = 1;}else if(d == r)//点在圆上{flag = 0;}else//点在圆内{flag = -1;}return flag;
}//输出圆的信息
ostream& operator<<(ostream &output, Circle &c)
{output<<"("<<c.GetX()<<","<<c.GetY()<<")"<<" r = "<<c.GetR()<<endl;return output;
}//重载>运算符,用于比較两个圆的面积的大小
bool operator>(Circle &c1, Circle &c2)
{if(c1.GetArea() > c2.GetArea()){return true;}else {return false;}
}//重载<运算符,用于比較两个圆的面积的大小
bool operator<(Circle &c1, Circle &c2)
{if(c1.GetArea() < c2.GetArea()){return true;}else {return false;}
}//重载==运算符,用于比較两个圆的面积的大小
bool operator==(Circle &c1, Circle &c2)
{if(!(c1 > c2) && !(c1 < c2)){return true;}else {return false;}
}//重载!=运算符,用于比較两个圆的面积的大小
bool operator!=(Circle &c1, Circle &c2)
{if( !(c1 == c2)){return true;}else{return false;}
}//重载>=运算符,用于比較两个圆的面积的大小
bool operator>=(Circle &c1, Circle &c2)
{if( (c1 == c2) || (c1 > c2)){return true;}else{return false;}
}//重载<=运算符,用于比較两个圆的面积的大小
bool operator<=(Circle &c1, Circle &c2)
{if( (c1 == c2) || (c1 < c2)){return true;}else{return false;}
}void main( )
{Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1Point p1(1,1),p2(3,-2),p3(7,3);  //分别位于c1内、上、外cout<<"圆c1: "<<c1;cout<<"点p1: "<<p1;cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?

"外":((locate(p1, c1)<0)?"内":"上"))<<endl; cout<<"点p2: "<<p2; cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl; cout<<"点p3: "<<p3; cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?

"外":((locate(p3, c1)<0)?

"内":"上"))<<endl; cout<<endl; cout<<"圆c1: "<<c1; if(c1>c2) cout<<"大于"<<endl; if(c1<c2) cout<<"小于"<<endl; if(c1>=c2) cout<<"大于等于"<<endl; if(c1<=c2) cout<<"小于等于"<<endl; if(c1==c2) cout<<"等于"<<endl; if(c1!=c2) cout<<"不等于"<<endl; cout<<"圆c2: "<<c2; cout<<endl; system("pause"); }

运行结果

转载于:https://www.cnblogs.com/lytwajue/p/6993796.html

继承的综合运用《Point类派生出Circle类而且进行各种操作》相关推荐

  1. 定义一个Point类,派生出Circle类,计算各派生类对象的面积Area()

    定义一个Point类,派生出Circle类,计算各派生类对象的面积Area() #include<iostream> using namespace std; class Point { ...

  2. 定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount。

    [问题描述] 定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount. [输入形式] 程序参考的输入(数据前面文字为提示): Input N ...

  3. C++ 类继承:构造函数与析构函数调用顺序,派生类和基类之间的特殊关系,公有继承及其他

    文章目录 一.派生类构造函数与基类构造函数 二.创建与销毁派生类对象时,构造函数和析构函数的调用 三.派生类和基类之间的特殊关系 四.公有继承 (一).何为公有继承 (二).多态公有继承 (三).虚函 ...

  4. 设计一个圆形的类即Circle类。

    题目内容: 设计一个圆形的类即Circle类,具体要求如下: (1) 创建一个圆形的类,即Circle类,添加radius一个成员变量(数据类型为double ),表示圆形的半径: (2) 定义一个有 ...

  5. cpp课程设计实验题:定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生

    ``定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleMa ...

  6. 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleMana

    定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleMana ...

  7. 虚函数之定义一个基类Shape,在此基础上派生出Rectangle和Circle再使用Rectangle类创建一个派生类Square。

    定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea( )函数计算对象的面积,再使用Rectangle类创建一个派生类Square.将getArea()改造 ...

  8. 编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分

    编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形).Square(正方形).Rectangle(矩形).Trapezoid(梯形).Triangle(三角形).用虚函数分 ...

  9. 定义一个基本的银行账户类。在基本账户类的基础上派生出1年期定期账户、2年期定期账户、3年期定期账户和5年期定期账户。定义一个n个基类指针组成的数组,随机生成n个各类派生类的对象。让每个指针指向一个派生

    定义一个基本的银行账户类.在基本账户类的基础上派生出1年期定期账户.2年期定期账户.3年期定期账户和5年期定期账户.定义一个n个基类指针组成的数组,随机生成n个各类派生类的对象.让每个指针指向一个派生 ...

最新文章

  1. docker WARNING: IPv4 forwarding is disabled. 解决方法
  2. QQ协议TEA加密解密代码 C#
  3. 从内存管理原理,窥探OS内存管理机制
  4. 干货:科大讯飞最新语音识别系统和框架深度剖析
  5. 一些会遗忘的代码属性
  6. Reflector使用手记
  7. 前端干货-网站资源收集
  8. Xmind模板文档分享——生活计划(3)
  9. 基于阿里云服务器使用宝塔面板进行Hexo建站
  10. Excel怎么对比两个表格数据
  11. 计算机网络 理解拥塞控制
  12. 数学中蕴含的人生哲理
  13. win7休眠设置在哪里_电脑休眠好不好,在哪里开启?
  14. firefox下载管理器:FlashGot
  15. 解决tp5 Could not open input file: think问题
  16. django实现websocket作为安卓开发后台(软件课设,oo聊天)
  17. ubuntu终端下字体放大缩小快捷键
  18. 大一初学c语言——程序设计基础
  19. [python]:幂集
  20. 用户信息管理系统(Web实践项目)

热门文章

  1. ubuntu 安装redis
  2. linux学习笔记(软件包管理)
  3. [转]孙鑫VC教程例子代码1---Windows程序内部运行原理
  4. DELL Poweredge服务器安装操作系统指南 补全之磁盘驱动制作
  5. 完成登录与注册页面的前端
  6. Mysql数据库 sql 语句调优
  7. jQuery 中的 Ajax
  8. ElasticSearch大批量数据入库
  9. mongodb数据库磁盘碎片整理。
  10. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索