类的组合与继承

(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. [Javascript] HTML5 地理位置定位(HTML5 Geolocation)原理及应用

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  2. php 判断过去离现在几年的函数

    function gettime($worktime){ $time=time(); $amount=date("Y",$time)-date("Y",strt ...

  3. php pdo具体操作

    0x01:测试PDO是否安装成功 运行如下代码,如果提示参数错误,说明PDO已经安装,如果说明对象不存在,则修改PHP配置文件php.ini,取消php_pdo_yourssqlserverhere. ...

  4. php和nodejs

    整个故事正如好莱坞大片的经典剧情走向:两位昔日好友如今分道扬镳,甚至被迫陷入了你死我活的斗争当中.刚开始的分歧并不严重,无非是一位老友对于另一位伙伴长久以来占据.但又绝口不提的业务领域产生了点兴趣.而 ...

  5. windows下flink示例程序的执行

    1.什么是flink Apache Flink® - Stateful Computations over Data Streams 2.启动 下载地址  我下载了1.7.2 版本  解压到本地文件目 ...

  6. 浅析CLR的异常处理模型

    文章目录: 异常概述 CLR中的异常处理机制 CLR中异常的核心类System.Exception类 异常处理的设计规范和最佳实践 异常处理的性能问题 其他拓展 1.异常概述 异常我们通常指的是行动成 ...

  7. ComboxBox控件、checklistbox控件和listbox控件的组合开发

    第一步:先创建一个WinForm窗体应用程序,按照下图所示的进行布局. 第二步:为ComboxBox控件.checklistbox控件和listbox控件和button控件设置属性 第三步:在代码中的 ...

  8. Laravel5 开启Debug

    Laravel默认没有开启Debug,打开需要两步: .env文件中设置APP_DEBUG=true: 把Laravel服务重启一下(摸索出来的). 这只是开启了基本的调试模式,如果需要看更详细的调试 ...

  9. mac 安装卸载python

    第 1 步,删除框架: sudo rm -rf /Library/Frameworks/Python.framework/Versions/x.x第 2步,删除应用目录: sudo rm -rf &q ...

  10. kali2018.2安装配置OpenVAS-9及错误处置

    1 配置环境 1)虚拟机环境:VMware® Workstation 14 Pro(版本号:14.1.2 build-8497320),如图1. 图1 虚拟机版本信息 2)kali镜像 Kali201 ...