类的组合与继承

(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应该大于c1
Point 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");
}

运行结果

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

  1. C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等

    . 从people(人员)类派生出student(学生)类 添加属性:班号char classNO[]:从people类派生出teacher(教师)类, 添加属性:职务char principalsh ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. 实现如下类之间的继承关系,并编写Music类来测试这些类。

    实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hanqi.test; public class Instrument { //输出弹奏乐器 public void ...

  4. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  5. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...

  6. 使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

    使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form 开发环境: Wing IDE 6.1 步骤1: 打开 Wing IDE,创建一个新的 pr ...

  7. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  8. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  9. C++ 继承 - 在派生类中对基类初始化

    构造函数与基类的其他成员不同,不能被派生类继承,因此为了初始化基类中的成员变量,需要在派生类中调用基类的构造函数(即显式调用),如果派送类没有调用则默认调用基类的无参构造函数(即隐式调用). 显式调用 ...

随机推荐

  1. 关于打包压缩几种格式(gzip,bzip2,xz)的试验对比

    要通过脚本进行备份,必然将会应用到压缩技术,这里简单针对几个常见的格式进行测验,从而得到一种合适的方式. 这里以一个应用目录做例子: [root@isj-test-5 mnt]$du -sh * 66 ...

  2. 【算法】Quick Select

    针对问题 找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案). 关键思想 拿一个数 ...

  3. vcpkg错误分析方法

    最近在使用vcpkg时,经常会碰到CMake错误. 有些以前能编译通过的包, 过一段时间又不能编译错误了. 错误提示一般是CMake错误, 弄得很郁闷. 我采用以下步骤解决了问题: 分析错误 查看错误 ...

  4. BZOJ 1951 Lucas定理+CRT

    思路: 枚举约数 套个裸的Lucas+CRT就完了... //By SiriusRen #include <cmath> #include <cstdio> using nam ...

  5. A - I Wanna Be the Guy

    Problem description There is a game called "I Wanna Be the Guy", consisting of n levels. L ...

  6. (转)webpack从零开始第6课:在Vue开发中使用webpack

    vue官方已经写好一个vue-webpack模板vue_cli,原本自己写一个,发现官方写得已经够好了,自己写显得有点多余,但为了让大家熟悉webpack,决定还是一步一步从0开始写,但源文件就直接拷 ...

  7. mybatis学习笔记之基础复习(3)

    mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...

  8. IM系统中如何保证消息的可靠投递(即QoS机制)

      消息的可靠性,即消息的不丢失和不重复,是im系统中的一个难点.当初qq在技术上(当时叫oicq)因为以下两点原因才打败了icq:1)qq的消息投递可靠(消息不丢失,不重复)2)qq的垃圾消息少(它 ...

  9. 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

    出现此错误的原因是因为事务等待造成的,找出等待的事务,kill即可. 下面是我当时遇到的错误: ---删除表t1时出现错误 SCOTT@GOOD> drop table t1; drop tab ...

  10. sql多表关联

    inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...