2013级C++第11周(春)项目——通过继承拥有基类的资源

来源:互联网 发布:手机浏览器导航页 知乎 编辑:程序博客网 时间:2024/05/16 10:55

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接


(注:本课资料由第9周直接到第11周,因为第10周是我校春假期,全校休课。春假,实际是五一、清明、端午打包一起休息,这亲戚的做法对按周安排活动的学校更好一些。)

第一部分 程序阅读 
程序阅读1: 
#include<iostream>using namespace std;class  A{private:    int  x;protected:    int y;public:    int z;    A(int a,int b,int c)    {        x=a;            y=b;        z=c;    }    int  Getx()    {        return x;      }    int  Gety()    {        return y;      }    void ShowA()    {        cout<< "x="<<x<<'\t';        cout<<"y="<<y<<'\t';        cout<<"z="<<z<<'\n';    }};class B:public A{private:    int m,n;public:    B(int a,int b,int c,int d,int e):A(a,b,c)    {        m=d;        n=e;    }    void Show()    {        cout<<"m="<<m<<'\t'<<"n="<<n<<'\n';        cout<<"x="<<Getx()<<'\t';        cout<<"y="<<y<<'\t'<<"z="<<z<<'\n';    }    int Sum()    {        return (Getx()+y+z+m+n);    }};int main(){    B b1(1,2,3,4,5);      b1.ShowA();    b1.Show();    cout<< "Sum="<<b1.Sum()<<'\n';    cout<<"x="<<b1.Getx()<<'\t';    cout << "y=" <<b1.Gety()<<'\t';    cout << "z="<<b1.z<<'\n';    return 0;}
(1)先阅读程序,写出你预想的运行结果:
___________________________________
___________________________________
___________________________________
___________________________________
___________________________________

(2)再记录运行结果:
___________________________________
___________________________________
___________________________________
___________________________________
___________________________________
(3)如果两者有差异,再读程序给出解释:_____________________________________________。
(4)观察基类A中成员的访问权限制以及派生类B中对这些成员的访问方法。

程序阅读2:
#include <iostream>using namespace std;class Part  //部件类{public:    Part();    Part(int i);    ~Part();private:    int val;};Part::Part(){    val=0;    cout<<"调用Part的默认构造函数:"<<val<<endl;}Part::Part(int i){    val=i;    cout<<"调用Part的构造函数: "<<val<<endl;}Part::~Part(){    cout<<"调用Part的析构函数: "<<val<<endl;}class Whole: public Part{public:    Whole();    Whole(int,int,int,int);    ~Whole();private:    Part one;    Part two;    int data;};Whole::Whole(){  data=0;  cout<<"调用whole的默认构造函数: "<<data<<endl;}Whole::Whole(int p, int i,int j,int k):  Part(p),one(j),two(i),data(k)  //问题2{    cout<<"调用whole的构造函数: "<<data<<endl;}Whole::~Whole(){    cout<<"调用whole的析构函数: "<<data<<endl;}void f(){    Whole w1;    Whole w2(1,2,3,4);}int main(){    f();    return 0;}
(1)先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。
(2)将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
Whole::Whole(int p, int i,int j,int k):  Part(p),two(i),one(j),data(k)  //问题2

第2部分 项目
【项目1 - 存储班长信息的学生类】
class Stu   //声明基类{public:    Stu(int n, string nam );  //基类构造函数    void display( );          //成员函数,输出基类数据成员protected:        //(*)访问权限为保护型的数据成员    int num;      //学生学号    string name;  //学生姓名};class StuDetail: public Stu              //声明派生类StuDetail{public:    //学生nam,学号n,a岁,家住ad,他的班长是nam1,学号n1    StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生类构造函数    void show( ); //成员函数,输出学生的信息    void show_monitor( );    //成员函数,输出班长信息private:    Stu monitor;   //学生所在班的班长,班长是学生,是Stu类的成员    int age;       //学生年龄    string addr;   //学生的住址};int main( ){    //学生王力,10010号,19岁,家住上海的北京路,他的班长是李孙,学号10001    StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");    s.show( );                       //输出学生信息    s.show_monitor();                //输出班长信息    return 0;}
(1)上面是声明好的类及测试函数,请完成类中成员函数的定义,使运行结果如图所示。

(2)将Stu类的数据成员的访问权限改为private,你的程序是否能完成要求的功能?如果不行,请修改程序。请不要修改给出的代码,只能修改自己写的代码。 

【项目2 - 职员有薪水了】定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。并在此基础上派生出CEmployee类,派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。要求派生类CEmployee的构造函数显示调用基类CPerson的构造函数,并为派生类CEmployee定义析构函数,定义输出信息的函数。
class CPerson{protected:    string m_szName;    string m_szId;    int m_nSex;//0:women,1:man    int m_nAge;public:    CPerson(string name,string id,int sex,int age);    void Show1();    ~CPerson();};class CEmployee:public CPerson{private:    string m_szDepartment;    double m_Salary;public:    CEmployee(string name,string id,int sex,int age,string department,double salary);    void Show2();    ~CEmployee();};int main(){    string name,id,department;    int sex,age;    double salary;    cout<<"input employee's name,id,sex(0:women,1:man),age,department,salary:\n";    cin>>name>>id>>sex>>age>>department>>salary;    CEmployee employee1(name,id,sex,age,department,salary);    employee1.Show2();    return 0;}
下面的运行结果供参考:

【项目2拓展(选做)】字符串除了用C++扩充的string类型外,按C语言的传统,还用char *表示。请将类声明中的string全部改为char *后,重新写一遍程序(此时的区别是,类中有指针成员,构造和析构函数需要考虑深复制的问题了。)
class CPerson{protected:char *m_szName;char *m_szId;int m_nSex;//0:women,1:manint m_nAge;public:CPerson(char *name,char *id,int sex,int age);void Show1();~CPerson();};class CEmployee:public CPerson{private:char *m_szDepartment;float m_Salary;public:CEmployee(char *name,char *id,int sex,int age,char *department,float salary);void Show2();~CEmployee();};int main(){char name[10],id[19],department[10];int sex,age;float salary;cout<<"input employee's name,id,sex(0:women,1:man),age,department,salary:\n";cin>>name>>id>>sex>>age>>department>>salary;CEmployee employee1(name,id,sex,age,department,salary);employee1.Show2();return 0;}

【项目3 - 点类派生直线类】定义点类Point,并以点类为基类,派生出直线类Line,从基类中继承的点的信息表示直线的中点。请阅读下面的代码,并将缺少的部分写出来。
#include<iostream>#include<Cmath>using namespace std;class Point //定义坐标点类{public:    Point():x(0),y(0) {};    Point(double x0, double y0):x(x0), y(y0) {};    void PrintPoint(); //输出点的信息protected:    double x,y;   //点的横坐标和纵坐标};void Point::PrintPoint(){    cout<<"Point: ("<<x<<","<<y<<")";    //输出点}class Line: public Point   //利用坐标点类定义直线类, 其基类的数据成员表示直线的中点{public:    Line(Point pts, Point pte); //构造函数,用初始化直线的两个端点及由基类数据成员描述的中点    double Length();    //计算并返回直线的长度    void PrintLine();   //输出直线的两个端点和直线长度private:    class Point pts,pte;   //直线的两个端点,从Point类继承的数据成员表示直线的中点};int main(){    Point ps(-2,5),pe(7,9);    Line l(ps,pe);    cout<<"About the Line: "<<endl;    l.PrintLine();  //输出直线l的信息:两端点及长度    cout<<"The middle point of Line is: ";    l.PrintPoint(); //输出直线l中点的信息    return 0;}
程序运行参考图:


【项目4 - 类族的设计】按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积、体积并输出并且完成要求的计算任务:
    (1)先建立一个Point(点)类,包含数据成员x,y(坐标点),实现需要的成员函数,并设计main函数完成测试;
    (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试;
    (3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main函数完成测试。
     要求编写程序,设计出各类中“需要的成员函数”,包括构造函数、析构函数、修改数据成员和获取数据成员的公共接口、用于输出的重载运算符“<<”函数等。
   (提示:此任务可以分为三个子任务分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。——这种方法适用于做任何的项目)


================= 迂者 贺利坚 CSDN博客专栏=================|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==||== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==||== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====




0 0
原创粉丝点击