实验二 类的继承与派生
实验二类的继承与派生
一、实验目的
1. 掌握类的声明和使用。
2. 掌握对象的声明和使用。
3. 掌握具有不同访问属性的成员的访问方式。
4. 观察构造函数和析构函数的执行过程。
5. 学习声明和使用类的继承关系,声明派生类;
6. 熟悉不同继承方式下对基类成员的访问控制;
二.实验内容
1. 设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、
id(身份证号)等等。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号charid[20]。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、组合。在测试程序中声明people 类的对象数组,录入数据并显示。
2. 从people(人员)类派生出student(学生)类,添加属性:班号char classNO[7];从people 类派生出teacher(教师)类,添加属性:职务char pship[11]、部门char departt[21]。从student 类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate 类和teacher 类派生出TA(助教博士生)类,重载相应的成员函数,测试这些类。
三 . 实验步骤
1.程序代码
第一题
#include
#include
using namespace std;
class Date //日期类
{
private:
int year;
int month;
int day;
public:
Date(){} //默认构造
Date(int y,int m,int d) //带参构造
{
year=y;
month=m;
day=d;
}
void set() //设置数据函数
{
cin>>year>>month>>day;
}
void display() //显示函数
{
cout< } }; class Person //人员类 { private: string name; int num; char sex; Date birthday; char ID[18]; public: Person(){} //默认构造 Person(int n,int y,int m,int d,char id[18],char s='m'):birthday(y,m,d) { num=n; sex=s; strcpy(ID,id); } //有默认值的带参构造 Person(Person& p) //拷贝构造 { name=https://www.360docs.net/doc/6118676699.html,; num=p.num; sex=p.sex; birthday=p.birthday; strcpy(ID,p.ID); } void input() //输入函数 { cout<<"录入数据:"< cout<<"姓名:"; cin>>name; cout<<"编号:"; cin>>num; cout<<"性别(m/f):"; cin>>sex; cout<<"生日:"; birthday.set(); cout<<"身份证号:"; cin>>ID; ID[18]='\0'; cout< } void output() //输出函数 { cout<<"编号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"生日:"; birthday.display(); cout< cout<<"身份证号:"< } ~Person() //析构函数 { cout<<" "< }; int main() { Person p1; p1.input(); p1.output(); return 0; } 第二题 #include #include using namespace std; class Date //日期类 { private: int year; int month; int day; public: Date(){} //默认构造 Date(int y,int m,int d) //带参构造 { year=y; month=m; day=d; } void set() //设置数据函数 { cin>>year>>month>>day; } void display() //显示函数 { cout< } }; class Person //人员类 { private: string name; int num; char sex[10]; Date birthday; char ID[18]; public: Person(){} //默认构造 Person(int n,int y,int m,int d,char id[18],char sex[10]):birthday(y,m,d) { num=n; strcpy(ID,id); } //有默认值的带参构造 Person(Person& p) //拷贝构造 { name=https://www.360docs.net/doc/6118676699.html,; num=p.num; birthday=p.birthday; strcpy(ID,p.ID); } void input() //输入函数 { cout<<"姓名:"; cin>>name; cout<<"编号:"; cin>>num; cout<<"性别(男/女):"; cin>>sex; cout<<"生日:"; birthday.set(); cout<<"身份证号:"; cin>>ID; ID[18]='\0'; cout< } void output() //输出函数 { cout<<"编号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"生日:"; birthday.display(); cout< cout<<"身份证号:"< } ~Person() //析构函数 { //cout<<" "< }; class stduent:public Person { char classno[7]; public: student(){ cout<<"*************"< void input() { Person::input(); cout<<"输入学号"< cin>>classno; } void getno(){ Person::output(); cout<<"学号为:"< } }; class teacher:public Person { char pship[11],departt[21]; public :teacher(){ cout<<"***********"< void input() { Person::input(); cout<<"输入职务"< cin>>pship; cout<<"输入部门"< cin>>departt; } void inputt() { cout<<"输入职务"< cin>>pship; cout<<"输入部门"< cin>>departt; } void getno(){ Person::output(); cout<<"职务为:"< cout<<"部门为:"< } void output () { cout<<"职务为:"< cout<<"部门为:"< } }; class graduate:public stduent { char subject[21], adviser[21]; public :graduate(){ cout<<""< } void input() { stduent::input(); cout<<"输入专业:"< cin>>subject; cout<<"输入导师:"< cin>>adviser; } void getno() { stduent::getno(); cout<<"专业为:"< cout<<"导师为:"< } }; class TA :public graduate,teacher { public :TA(){ } void input() { graduate::input(); teacher::inputt(); } void getno() { graduate::getno(); teacher::output(); } }; int main() { Person p1; stduent s; teacher t; graduate g; TA T; cout<<"请依次输入人员数据信息"< p1.input(); cout<<"请输入学生数据信息"; s.input(); cout<<"请输入老师数据信息"; t.input(); cout<<"请输入研究生数据信息"; g.input(); cout<<"请输入助教博士数据信息"; T.input(); cout<<"人员数据信息为:"; p1.output(); cout<<"学生数据信息为:"; s.getno(); cout<<"老师信息为:"; t.getno(); cout<<"研究生信息为:"; g.getno(); cout<<"助教博士信息为:" T.getno(); } 2.调试程序 第一次调试,发现没有名字的显示。后来依照其他属性的格式,在相应的位置添加了相关的语句。比如cout<<"姓名:";cin>>name;再比如cout<<"姓名:"< cout<<"性别:"< 3.运行程序运行结果截图 图一 四.实验小结 通过这次实习,我掌握了很多,C++看似和C语言没什么区别其实差别很大。一个是面向过程的,一个是面向对象的。所以以后我们应该好好的学习c++。而且c++的继承派生问题也很难需要自己多多的实践和看书。 实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1) (2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。 2. #include 注意派生类的构造函数中对基类数据成员的初始化方法(即 Circle(double xv,double yv,double vv):Point(xv,yv)), 以及构造函数中对对象成员的初始化方法(即 Line(double xv1,double yv1,double xv2,double yv2) : start(xv1,yv1),end(xv2,yv2){ } ) 【要求】 (1)建立工程,录入上述程序,改变数据实验之。 (2)修改Point 类的数据成员x ,y 的访问权限为private ,再运行,结果如何? (3)如果不将Line 类设为 Point 类的友元,应采取什么措施?为哪个类增加数据或函数成员? 2.编程:多层派生练习,由上题Point 类和Circle 类继续派生出Cylinder 类。要求计算圆柱体的底面积、侧面积、全面积和体积。 实验4 继承与派生---参考程序 二、实验内容 1.定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩。 #include 实验2 派生类与继承 实验课程名:面向对象程序设计(C++) 专业班级:学号:姓名: 实验时间:实验地点:指导教师: 2.1实验目的和要求 (1) 掌握派生类的声明方法和派生类构造函数的定义方法。 (2) 掌握不同继承方式下,基类成员在派生类中的访问属性。 (3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4) 学习虚基类在解决二义性问题中的作用。 二、实验内容 一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。 实验代码如下: #include ~Geometry(){} double GetArea(){}//求面积函数double GetPerimeter(){}//求体积函数double Getcolume(){}//求周长函数 virtual show(){} }; class Circle:public Geometry { public: Circle(double i) { radiums=i; } ~Circle(){} double GetArea(); double Getcolume(); double R() { return radiums; } show(); private: 实验四继承与派生 实验四派生类与继承 【实验类型】验证性实验【实验课时】2学时 【实验目的】 (1)理解类的继承的概念,能够定义和使用类的继承关系。 (2)掌握派生类的声明与定义方法。 (3)熟悉公有派生和私有派生的访问特性。 (4)学习虚基类在解决二义性问题中的作用。 【实验环境】 硬件:计算机 软件:Microsoft Visual C++ 6.0 【实验内容】 1、按要求阅读、编写、调试和运行以下程序。 (1)实验内容 ①定义一个基类MyArray,基类中可以存放一组整数。 class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length;}; // 整数的个数 基类中有构造函数、析构函数、输入数据和输出数据的函数。 ②定义一个类SortArray继承自MyArray ,在该类中定义函数实现排序功能。 ③定义一个类ReArray继承自MyArray ,在该类中定义函数实现逆转功能。 ④定义一个类AverArray继承自MyArray ,在该类中定义函数Aver求解整数的平均值。 ⑤定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转、和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。 (2)实验程序 (参考) 程序如下: #include "iostream.h" #include "process.h" class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length; // 整数的个数 }; MyArray::MyArray(int leng) { length=leng; alist=new long int[length]; if(alist==NULL) { cout<<"对不起,创建失败。请重试。 ";exit(1); } } MyArray::~MyArray() {继承和派生实验报告
实验4 继承与派生-程序
c++派生类与继承实验报告材料
实验四 继承与派生讲解学习
实验6-继承与派生(1)