已有表示平面上点的类Point声明如下: class Point{ protected: //需要在子类中直接访问,所以不要设置为private double x, y; public: static double PI;//静态成员变量 public: Point(double a=0, double b=0); double xOffset()const; double yOffset()const; double angle()const; double radius()const; Point operator+(const Point& d)const; friend inline ostream& operator<<(ostream& o, const Point& d); }; 请实现Point类, 并设计一个类Circle继承自上述Point类,并添加半径数据成员,设计并实现下面方法:修改半径 ,获取半径 ,获取中心点,计算面积,计算周长,移动到新位置。修改半径 ,获取半径 ,获取中心点,计算面积,计算周长,移动到新位置。 ### 面向对象编程——继承法构造复杂对象 #### 一、背景介绍与目标设定 本篇将探讨如何利用面向对象编程中的继承特性来构建更复杂的类结构。具体而言,我们将基于已有的 `Point` 类(用于表示平面上的一个点),通过继承的方式创建一个新的 `Circle` 类(用于表示一个圆)。为了使 `Circle` 类具备更多的功能,我们需要添加额外的数据成员(如半径)以及一系列的操作方法。 #### 二、基础类 `Point` 的实现 在面向对象编程中,类是定义数据类型的一种手段。`Point` 类是我们的起点,它包含了两个受保护的成员变量 `x` 和 `y`,分别代表点的横坐标和纵坐标。此外,还提供了一系列的公共成员函数,以便对点进行操作。 ##### 1. 构造函数 ```cpp Point::Point(double a = 0, double b = 0) { x = a; y = b; } ``` 构造函数允许我们创建 `Point` 对象时指定初始坐标。默认情况下,如果未指定坐标,则点位于原点 `(0, 0)`。 ##### 2. 访问坐标的方法 ```cpp double Point::xOffset() const { return x; } double Point::yOffset() const { return y; } ``` 这两个方法允许我们获取点的横纵坐标。 ##### 3. 角度与半径的计算 ```cpp double Point::angle() const { return (180 / PI) * atan2(y, x); } double Point::radius() const { return sqrt(x * x + y * y); } ``` `angle()` 方法用于计算点相对于原点的角度,而 `radius()` 方法则计算点到原点的距离,即该点作为圆心时的半径。 ##### 4. 点的加法与位移 ```cpp Point Point::operator+(const Point &d) const { return Point(x + d.x, y + d.y); } Point &Point::operator+=(const Point &d) { x += d.x; y += d.y; return *this; } ``` 这里实现了点的加法运算符 `+` 和累加运算符 `+=`,使得我们可以方便地进行点之间的相加或位移操作。 ##### 5. 移动点 ```cpp void Point::moveTo(double a, double b) { x = a; y = b; } ``` `moveTo()` 方法用于将点移动到新的位置。 ##### 6. 输出流操作符 ```cpp inline ostream &operator<<(ostream &o, const Point &d) { o << "(" << d.x << ", " << d.y << ")"; return o; } ``` 这个友元函数用于重载 `<<` 运算符,使得我们可以直接通过 `cout` 输出点的信息。 #### 三、继承与扩展——`Circle` 类的设计 基于 `Point` 类,我们可以通过继承的方式创建 `Circle` 类。这样做的好处在于,`Circle` 类可以自动获得 `Point` 类的所有属性和方法,同时还可以添加新的属性和方法。 ##### 1. 定义 `Circle` 类 ```cpp class Circle : public Point { double radius; public: Circle(const Point &p = Point(), double r = 0) : Point(p), radius(r) {} double get_radius() const { return radius; } void set_radius(double r) { radius = r; } double get_center() const { return Point(x, y); } double area() const { return PI * radius * radius; } double circumference() const { return 2 * PI * radius; } void moveTo(double a, double b) { x = a; y = b; } }; ``` - **构造函数**:`Circle` 类的构造函数接受一个 `Point` 对象和一个半径值作为参数。 - **获取和设置半径**:提供了 `get_radius()` 和 `set_radius()` 方法来获取和修改圆的半径。 - **获取中心点**:`get_center()` 方法返回圆心的位置。 - **计算面积和周长**:`area()` 和 `circumference()` 分别计算圆的面积和周长。 - **移动到新位置**:与 `Point` 类相同,我们也为 `Circle` 类提供了 `moveTo()` 方法,用于改变圆心的位置。 通过这种方式,我们不仅能够利用已有的 `Point` 类的功能,还能根据实际需求为 `Circle` 类添加更多有意义的方法。 #### 四、总结 通过本篇的学习,我们了解了如何在 C++ 中使用面向对象编程的思想来构造复杂对象。特别是通过继承机制,可以有效地复用已有类的代码,并在此基础上扩展新的功能。这对于提高代码的可读性和可维护性都具有重要意义。希望这些知识点能对你在实际编程中的应用有所帮助。
- 粉丝: 1860
- 资源: 65
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助