1. 声明一个基类Shape,在此基础上派生出Rectangle和Circle类,二者都具有GetArea()函数以计算对象的面积;使用Rectangle类再创建一个派生类Square。实现并测试这些类。 2. 声明一个object类,有数据成员weight及相应的操作函数,由此派生出box类,增加数据成员height和width及相应的操作函数,声明一个box对象,实现并测试这些类,同时观察构造函数和析构函数的调用顺序。 ### 实验三 继承与派生 #### 知识点一:声明基类 `Shape` 及其派生类 `Rectangle` 和 `Circle` **背景:** 在本实验的第一部分,我们首先定义了一个名为 `Shape` 的基类,该类包含两个私有成员变量 `x` 和 `y` 表示图形的位置坐标,并提供了一组公有的成员函数用于设置和获取这些值。此外,`Shape` 类还包含一个纯虚函数 `getArea()` 用于计算图形的面积。 **代码解析:** 1. **基类 Shape 的定义:** - 构造函数 `Shape(double x0 = 0.0, double y0 = 0.0)` 初始化位置坐标,默认值为 (0, 0)。 - 成员函数 `set(double x0, double y0)` 设置新的坐标值。 - 成员函数 `getX()` 和 `getY()` 分别返回当前坐标值。 - 虚函数 `getArea()` 定义为纯虚函数,表示所有派生类必须重写这个方法来具体实现面积的计算。 2. **派生类 Rectangle 的定义:** - 继承自 `Shape`,新增私有成员变量 `width` 和 `height` 代表矩形的宽度和高度。 - 构造函数 `Rectangle(double x0 = 0.0, double y0 = 0.0, double w = 0.0, double h = 0.0)` 初始化位置坐标和尺寸,默认值为 (0, 0) 和 (0, 0)。 - 成员函数 `set(double x0, double y0, double w, double h)` 设置新的位置坐标和尺寸。 - 成员函数 `getWidth()` 和 `getHeight()` 返回矩形的宽度和高度。 - 重写了虚函数 `getArea()` 来计算矩形的面积。 3. **派生类 Circle 的定义:** - 同样继承自 `Shape`,新增私有成员变量 `radius` 表示圆的半径。 - 构造函数 `Circle(double x0 = 0.0, double y0 = 0.0, double r = 0.0)` 初始化位置坐标和半径,默认值为 (0, 0) 和 0。 - 成员函数 `set(double x0, double y0, double r)` 设置新的位置坐标和半径。 - 成员函数 `getRadius()` 返回圆的半径。 - 重写了虚函数 `getArea()` 来计算圆的面积。 #### 知识点二:声明派生类 `Square` 并继承自 `Rectangle` **背景:** 在这一部分,我们基于 `Rectangle` 类创建了 `Square` 类,因为正方形可以看作是宽高相等的矩形,所以这里直接继承自 `Rectangle` 类,并通过构造函数和成员函数来保证正方形的边长相等。 **代码解析:** 1. **派生类 Square 的定义:** - 继承自 `Rectangle`。 - 构造函数 `Square(double x0 = 0.0, double y0 = 0.0, double len = 0.0)` 初始化位置坐标和边长,默认值为 (0, 0) 和 0。 - 成员函数 `set(double x0, double y0, double len)` 设置新的位置坐标和边长。 - 成员函数 `getLen()` 返回正方形的边长,这里实际上是调用了 `Rectangle` 类中的 `getHeight()` 方法。 #### 知识点三:声明 `Object` 类及其派生类 `Box` **背景:** 第二部分,我们定义了一个 `Object` 类作为基类,包含一个数据成员 `weight` 表示物体的重量,以及一个构造函数。然后定义了一个派生类 `Box`,增加了两个数据成员 `height` 和 `width` 来表示盒子的高度和宽度,并且实现了相应的构造函数和成员函数。 **代码解析:** 1. **基类 Object 的定义:** - 构造函数 `Object()` 输出 "objectofconst",用于观察构造函数的调用过程。 2. **派生类 Box 的定义:** - 继承自 `Object`,新增私有成员变量 `height` 和 `width` 代表盒子的高度和宽度。 - 构造函数 `Box(double w, double h)` 初始化重量和尺寸。 - 成员函数 `setWeight(double w)` 设置重量。 - 成员函数 `setHeight(double h)` 和 `setWidth(double w)` 分别设置盒子的高度和宽度。 - 成员函数 `getWeight()`、`getHeight()` 和 `getWidth()` 分别返回对应的值。 通过以上实验,我们可以学习到 C++ 中继承的基本概念和用法,包括如何定义基类和派生类,如何重写基类的方法以及如何使用构造函数初始化成员变量。这些基础知识对于理解和掌握面向对象编程的核心思想非常重要。
using namespace std;
const double PI=3.14;
class Shape //基类Shape类
{
public:
Shape(double x0=0.0,double y0=0.0){ x=x0;y=y0;};//构造函数
void set(double x0,double y0){ x=x0; y=y0;};//设置函数
double getX() {return x;};//返回横坐标
double getY() {return y;};//返回纵坐标
virtual double getArea()=0;//这里使用了第8章中的纯虚函数,原设计为: double getArea(){return 0.0;}//计算面积
~Shape(){};//析构函数
private:
double x;//图形位置的横坐标
double y;//图形位置的纵坐标
};
class Rectangle:public Shape //Rectangle类声明
{
public:
Rectangle(double x0=0.0,double y0=0.0,double w=0.0,double h=0.0);//构造函数
void set(double x0,double y0,double w,double h);//设置函数
double getWidth(){ return width; }//返回宽度
double getHeight(){ return height;}//返回高度
double getArea(){ return width*height;}//返回面积
~Rectangle(){};//析构函数
private:
double width;//宽
double height;//高
};
{
width=w;
height=h;
}
void Rectangle::set(double x0,double y0,double w,double h)//设置函数
{
Shape::set(x0,y0);
width=w;
height=h;
}
class Circle:public Shape //Circle类声明
{
public:
Circle(double x0=0.0,double y0=0.0,double r=0.0);//构造函数
void set(double x0,double y0,double r)
{ Shape::set(x0,y0); radius=r; };//设置函数
double getRadius(){ return radius;}//返回半径
double getArea(){ return PI*radius*radius;}//返回面积
~Circle(){};//析构函数
private:
double radius;
};
Circle::Circle(double x0,double y0,double r):Shape(x0,y0)//构造函数
{ radius=r; }
//Square类实现
class Square:public Rectangle //正方形类
{
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助