C++编程:Shape派生与继承实现

需积分: 10 5 下载量 30 浏览量 更新于2024-09-18 收藏 4KB TXT 举报
"这个实验是关于面向对象编程中的继承与派生概念的实践,通过创建一个基础类Shape,然后派生出Rectangle和Circle类,以及再由Rectangle派生出Square类来实现。实验中涉及了基类的抽象方法、构造函数、析构函数的使用,以及对象的初始化和成员函数的重写。此外,还讨论了如何从一个基本的object类派生出box类,并添加额外的数据成员和操作函数。" 在这个实验中,首先介绍了一个名为Shape的基类,它包含两个坐标变量x和y,并提供了一个纯虚函数`getArea()`,用于计算对象的面积。这个设计使得Shape成为一个抽象类,不允许直接实例化。为了实现具体的形状,我们需要从Shape类派生出子类,例如Rectangle和Circle。 Rectangle类是Shape的直接派生类,它增加了width和height属性,表示矩形的宽和高。Rectangle类覆盖了基类的`getArea()`函数,以计算矩形的面积。此外,它还提供了设置和获取宽度和高度的方法。在构造函数中,Rectangle调用了基类的构造函数来初始化坐标,然后初始化自身的宽和高。 Circle类同样派生自Shape,它包含一个半径变量r。Circle类的`getArea()`函数根据圆的半径计算面积,使用了常量PI。Circle类的构造函数也调用了基类的构造函数来设置中心坐标,并初始化半径。 实验的第二部分涉及了一个object类,它有一个weight数据成员和相应的操作函数。然后从object类派生出box类,添加了height和width数据成员,以及相应的操作函数。这个设计允许我们处理更复杂的对象,如具有重量、尺寸的箱子。实验中会创建box对象,并测试这些类的功能,同时观察构造函数和析构函数的调用顺序,这是理解对象生命周期的重要部分。 这个实验的目标是帮助学生理解和掌握面向对象编程中的继承概念,如何通过派生创建新的类并复用已有的功能,以及如何实现和覆盖成员函数。同时,它也强调了抽象类的使用和纯虚函数在定义接口时的作用,以及构造函数和析构函数在对象生命周期中的角色。
2014-10-23 上传
#include <iostream> #include <string> using namespace std; struct CPoint { int x ; int y ; }; class CRectangle { private: const int id;//常量数据成员 static int total;//静态数据成员 const static string sclass; const static int f=1.0f; CPoint lefttop ; CPoint rightdown ; public: CRectangle( ); CRectangle( CPoint& lt, CPoint& rd ); CPoint GetLefttop() const { return lefttop; } CPoint GetRightdown() const { return rightdown; } void SetLefttop(CPoint & pt) { lefttop=pt; } void SetRightdown(CPoint & pt) { rightdown=pt; } int Getid() const { return id; } static int Gettotal() { return total; } int Area( ) const; int Perimeter( ) const; }; int CRectangle::total=0;//静态数据成员必须在类的外部定义(正好一次)。 const string CRectangle::sclass="CRectangle"; CRectangle::CRectangle( ):id(++total) { lefttop.x=0; lefttop.y=0; rightdown.x=1; rightdown.y=1; } CRectangle::CRectangle( CPoint& lt, CPoint& rd ):id(++total) { lefttop = lt ; rightdown = rd ; } int CRectangle::Area( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return wd * ht ; } int CRectangle::Perimeter( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return 2 * ( wd + ht ) ; } int main() { CPoint lt, rd; cin >> lt.x >> lt.y; cin >> rd.x >> rd.y; CRectangle crt(lt,rd);//调用有参构造函数 CRectangle crt2;//调用默认构造函数 //创建常量对象 const CRectangle crt3(lt,rd); cout<<"当前创建的矩形个数为:"; cout<<CRectangle::Gettotal()<<endl; //返回矩形的左上和右下点 CPoint lt1=crt.GetLefttop(); CPoint lt2=crt.GetRightdown(); //显示矩形的坐标 cout<<crt.Getid()<<"号矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; //修改矩形的左上角点 cout<<"请输入矩形新的左上点坐标:"; cin>> lt.x>>lt.y; crt.SetLefttop(lt); lt1=crt.GetLefttop(); //显示修改后矩形的坐标 cout<<"矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示修改后矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; }