C++程序设计-第11周 继承与派生

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

(第10周学校放春假,空一周)

【目的】1. 掌握类的派生与继承的概念;2. 学会定义子类,重点是类的构造函数与析构函数

第一部分 阅读程序
【程序1】阅读下面的程序,写出程序运行结果,上机时再运行,对比结果是否有差异,仔细领会继承,以及基类、派生类中构造函数的写法及执行过程

#include <iostream>
#include <string>
using namespace std;
class Student//声明基类
{
public:                                  //公用部分
    Student(int n, string nam )             //基类构造函数,与例.5相同
    {
        num=n;
        name=nam;
    }
    void display( )                           //成员函数,输出基类数据成员
    {
        cout<<"num:"<<num<<endl<<"name:"<<name<<endl;
    }
protected:                                //保护部分
    int num;
    string name;
};

class Student1: public Student              //声明公用派生类Student1
{
public:
    Student1(int n, string nam,int n1, string nam1,int a, string ad): 					Student(n,nam),monitor(n1,nam1) //派生类构造函数
    {
        age=a;
        addr=ad;
    }
    void show( )
    {
        cout<<"This student is:"<<endl;
        display();                               //输出num和name
        cout<<"age: "<<age<<endl;                //输出age
        cout<<"address: "<<addr<<endl<<endl;     //输出addr
    }

    void show_monitor( )                        //成员函数,输出子对象
    {
        cout<<endl<<"Class monitor is:"<<endl;
        monitor.display( );                       //调用基类成员函数
    }
private:                                      //派生类的私有数据
    Student monitor;                          //定义子对象(班长)
    int age;
    string addr;
};

int main( )
{
    Student1 stud1(10010,"Wang-li",10001,"Li-sun",19,"115 Beijing Road,Shanghai");
    stud1.show( );                       //输出学生的数据
    stud1.show_monitor();                //输出子对象的数据
    return 0;
}

【程序2】先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。

#include <iostream>
using namespace std;
class Part  //部件类
{
    public:
	Part();
	Part(int i);
	~Part();
 private:
	int val;
};
class Whole: public Part
{
    public:
	Whole();
	Whole(int,int,int,int);
	~Whole();
 private:
	Part one;
	Part two;
	int data;
};
Part::Part()
{
    val=0;
	cout<<"The default constructor of part was called "<<val<<endl;
}
Part::Part(int i)
{
    val=i;
	cout<<"The constructor of part was called "<<val<<endl;
}
Part::~Part()
{
	cout<<"The destructor of part was called "<<val<<endl;
}
Whole::Whole()
{
    data=0;
	cout<<"The default constructor of whole was called "<<data<<endl;
}
Whole::Whole(int p, int i,int j,int k):Part(p), two(i),one(j),data(k)
{
    cout<<"The constructor of whole was called "<<data<<endl;
}
Whole::~Whole()
{
	cout<<"The destructor of whole was called "<<data<<endl;
}

int main()
{
    Whole w1;
	Whole w2(1,2,3,4);
	return 0;
}
/* 如果用vs2008,将上面的main()函数删除,换作下面的两个函数
void f()
{
    Whole w1;
	Whole w2(1,2,3,4);
}
int main()
{
    f();
	system("pause");
	return 0;
}
*/

第二部分 实践项目
【项目1】定义点类,并以点类为基类,派生出直线类,从基类中继承的点的信息表示直线的中点。请阅读下面的代码,并将缺少的部分写出来。

#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(); //输出点的信息
    double x,y;   //数据成员,表示点的横坐标和纵坐标
};
void Point::PrintPoint()
{
    cout<<"Point:("<<x<<","<<y<<")";    //输出点
}

class Line: public Point   //利用坐标点类定义直线类, 其基类的数据成员表示直线的中点
{
public:
    Line(Point pt1, Point pt2);  //构造函数,初始化直线的两个端点及由基类数据成员描述的中点,中点的坐标可以由端点坐标计算而来
    double Length();    //计算并返回直线的长度
    void PrintLine();   //输出直线的两个端点和直线长度
private:
    Point pts,pte;   //直线的两个端点
};
//下面定义Line类的成员函数

int main()
{
    Point ps(-2,5),pe(7,9);
    Line l(ps,pe);
    _____________________;//输出直线l的信息(请补全代码)
    cout<<"\n The middle point of Line: ";
    _____________________ ;//输出直线l中点的信息(请补全代码,调用成员函数完成)
    return 0;
}

【项目2】要求与项目1几乎完全相同(除Point类中的数据成员要求为private型),要求补全点类和直线类的定义,调用main()函数输出一条直线的信息。
    请不要直接copy项目1的代码,通过修改项目1的程序完成项目2的要求。在有关“抄之有道”的学习方法中,我们有阅读代码,然后自己再写出来的建议。所以,项目2可以在以下代码的提示下开始去做,在项目1中获得的经验会有所帮助,这个过程也会对项目1中的收获有更多理解。其实,当这一些技术熟练之后,根据需求会自己设计并实现,那是我们的最终目标。
    项目2可以参考的代码如下,在完成时可以根据需要自行添加其他成员函数,成员函数在类内实现还是类外实现,也可以自行决定。

class Point //定义坐标点类
{
public:
    //定义必要的构造函数
    void PrintPoint(); //输出点的信息
private:
    double x,y;   //点的横坐标和纵坐标
};
class Line: public Point   //利用坐标点类定义直线类, 其基类的数据成员表示直线的中点
{
public:
    Line(Point pts, Point pte);  //构造函数,用初始化直线的两个端点及由基类数据成员描述的中点
    void PrintLine();   //输出直线的两个端点和直线长度
private:
    class Point pts, pte;   //直线的两个端点
};
int main()
{
    Point ps(-2,5),pe(7,9);
    Line l(ps,pe);
    //下面输出直线l的端点、长度和、中点的信息

    return 0;
}

【项目3】定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。并在此基础上派生出CEmployee类,派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。要求派生类CEmployee的构造函数显示调用基类CPerson的构造函数,并为派生类CEmployee定义析构函数,定义输出信息的函数。

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;
}

下面的运行结果供参考:

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

时间: 2024-09-20 00:55:30

C++程序设计-第11周 继承与派生的相关文章

C++程序设计-第13周 继承与派生(二)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [目的] 1. 进一步掌握类的派生与继承的概念.应用方法2. 掌握继承方式对成员访问权限的影响3. 掌握虚基类的用法 第三部分 实践项目[项目1]理解基类中成员的访问限定符和派生类的继承方式由下面派生类StudentB对基类StudentA的继承-- #include <iostream> using namespace std; class StudentA //(1

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; protect

C++程序设计-第14周数组上机实践项目

回到课程主页,链接:C++程序设计课程主页-2012级 本次上机对应的教学内容:第5章   数组 - 一维数组 [项目1 - 数组大折腾]创建一个长度为20的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入,使后10个元素获得值,将所有元素值加倍后保存在数组中,最后由前往后输出数组中所有元素的值,再由后往前输出数组中所有元素的值,再输出数组中的所有偶数,以及下标为3的倍数的元素值. 报告模板及部分代码如下: /* * 程序的版权和版本声明部分 * Copyright (c)2

类的继承与派生

类的继承与派生 尽管在派生类对象中含有从基类继承而来的成员,但派生类并不能直接初始化这些成员,必须使用基类的构造函数来初始化它的基类成员. 初始化顺序:先初始化基类成员,在初始化自己新增成员. 派生类可以访问基类的公有成员和受保护成员. :: 类的作用域分辨符. 我们可以将基类的指针或引用绑定到派生类对象上,但反过来不行,不存在从基类向派生类的隐式转换. 我们用派生类初始化基类或赋值给基类时,调用的是基类相应的构造函数与赋值运算符函数.   子类成员与父类的同名 输出xy,监视一下变量就一目了然

C++程序设计-第2周结构体应用

第一部分 程序阅读 下面的程序建立起了如图所示的动态链表.阅读程序,在草稿纸上画出链表建立的过程,借此学会如何建立链表.可以通过单步执行以辅助理解 #include <iostream> using namespace std; struct Student { long num; float score; struct Student *next; }; int main( ) { Student *head=NULL,*p,*q; //下面的程序建立起一个有三个节点的动态链表 for(in

后台开发:核心技术与应用实践2.2 继承与派生

2.2 继承与派生 1.?继承与派生的一般形式 继承与派生在C++中也是经常使用的,比如设计一个箱子类可以用以下代码实现: Class CBox{ public:     int volume(){         return height*width*length;     }     void display(){         cout<<height<<endl;         cout<<width<<endl;         cout&l

C02-程序设计基础提高班(C++)第11周上机任务-运算符重载

第11周:阅读教材第10章(p314-346),掌握用运算符重载解决问题,完成第11周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) [任务1]实现复数类中的运算符重载定义一个复数类重载运算符+.-.*./,使之能用于复数的加减乘除.(1)方案一:请用类的成员函数完成运算符的重载: class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Comple

终结连续11周净回笼公开市场本周将投放资金

⊙记者 丰和 ○编辑 杨刚 本周央行票据发行量将降至340亿元,创下今年以来的低点,由此自春节后公开市场连续11周的净回笼局面或将于本周终结. 今天,央行将在公开市场发行200亿元三个月期央行票据.至此,本周央票发行量合计仅为340亿元,不到上周的四分之一.尽管,央行仍将有可能在今天的公开市场进行正回购操作.但是,由于本周为5月份到期释放资金量最大的一周,达到2160亿元,这意味着正回购量要达到1820亿元,才能单周实现净回笼.因此,自春节以来,公开市场连续11周从市场净回笼资金的局面将于本周中

2015级C++第10、11周补充实践项目 继承和派生

[项目0 - 是春哥啊]参考解答 请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为: Name: 春哥 Grade: 19 #include <iostream> #include <cstring> using namespace std; class Person{ public: Person(char* s){ strcpy(name,s); } void display( ){ cout<<"Name: "<<n