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

课程首页在: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:man
	int 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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====
时间: 2025-01-01 15:39:42

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

2013级C++第8周(春)项目——运算符重载

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1]实现复数类中的运算符重载(1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(C

2013级C++第12周(春)项目——成员的访问属性、多重继承

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读  1.阅读程序,分析类中成员的访问属性 #include <iostream> using namespace std; class A //A为基类 { public: void f1( ); int i; protected: void f2(); int j; private: int k; }; class B:

2013级C++第6周(春)项目——对象指针、const

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 推荐"玻璃罩const"系列的三篇文章(http://blog.csdn.net/sxhelijian/article/details/7385683),掌握利用const完成数据保护. 1. 使用常对象--为共用数据加装一个名为const的玻璃罩: 2. 常(const)+ 对象 + 指针:玻璃罩到底保护哪一个:

2013级C++第5周(春)项目——用构造函数初始化

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答   有同学总结:老二说用数组法做给了我思路,真是有兄弟,不孤单.做了这道题才发现以前没用数组法做的那个判断第几天的程序结果存在错误. 我评论:每个人身边都有一帮子兄弟.靠兄弟,就不用靠老师.兄弟总在身边,弟兄们一起长大! 还有,实践中感受到的,就是真正学习到的.在学习中,只有将直接的体验与老师的讲解.看过的书交融起来,才能真

2013级C++第2周(春)项目——结构体应用大体验

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 第一部分 结构体应用 [项目1-学生成绩统计]   每位同学的信息学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[12]).姓名(name).三门课的成绩(grade).总分(score).均分(average)). (1)从键盘上输入N名学生的信息(N定义为常变量

2013级C++第15周(春)项目——输入输出流及文件文件操作

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 本周程序阅读及程序调试中需要的文件,请到http://pan.baidu.com/s/1qW59HTi下载. 第一部分 阅读程序(运行程序时,由上面的链接下载源代码)1.阅读教材例13.1到例13.7的程序,根据所用到的函数在功能上的限制,自己设计输入的测试数据,运行程序.(1)与自己的期望结果相对照,理解各个函数的用法:(2)深入理解数据流类

2013级C++第4周(春)项目——再和对象找感觉

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 有网友在我的博客中,在2011级的页面上留言问:"老师,为什么有的学生写着写着就不更新了呢?"这是我常想起来的痛.我没有能够让我的弟子们开成习惯,这是要我们大家一起解决的问题. 有些同学近日的低迷,读读<大学.软件外包>可能会有启发.生命的流程走上了这条分支,就在这条分支上前行. 在BB平台恢复正常之前

2013级C++第9周(春)项目——运算符重载(二)

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [程序阅读]阅读程序"简单C++学生信息管理系统",找出其中出现构造函数.友元函数.运算符重载.静态数成员语法现象出现的位置,仔细体会其用法,在以后的设计中能够灵活应用有关方法和技巧 项目1-3直接复制第8周的代码,加入要求的运算符重载定义后,作为第9周的任务另外发博文.[项目1]在第8周项目1基础上(1)再定义一目运算符 -,-c相

2013级C++第16周(春)项目——二进制文件及字符流

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 本周程序阅读及程序调试中需要的文件,请到http://pan.baidu.com/s/1i3LxmDZ下载.期末临近,为适应OJ平台及熟悉内容,请自抽时间完成OJ平台的有关练习. 第一部分 阅读程序1.仔细研读例13.16.例13.17和例13.18(见下载链接),体会二进制文件和字符串流操作的一般方法.2.阅读下面的程序,指出其功能,并对比例