文档库 最新最全的文档下载
当前位置:文档库 › 实验四、类的继承与派生

实验四、类的继承与派生

实验四、类的继承与派生
实验四、类的继承与派生

实验四、类的继承与派生

09计算机1 白杨0929210028

1、定义1个CPeople类,其属性(保护类型)有:姓名、性别和年龄。

2、从CPeople类派生出CStudent类,增加属性:学号、入学时间和入学成绩;

3、从CPeople类派生出CTeacher类,添加属性:职务、部门和工作时间;

4、由CStudent类派生出CGraduate类,添加属性:研究方向和导师;

5、由CGraduate和CTeacher共同派生出在职研究生类CGradonWork

6、对上述类分别定义其中的构造函数和输出函数,并在主函数中定义对象,进行测试,测试的代码大致如下:

CGradonWork gradonWork("tzcer","男",32,"15","2003",335,"computer","tangmin","jsj","sxxy","2002-8");

gradonWork.Print();

其中CGradonWork 的构造函数参数分别对应的属性是一个在职的研究生对象,

其姓名为tzcer,性别为男,32岁,学号15,2003年读在职,入学成绩335,就读计算机方向,

其导师tangmin,同时tzcer也是sxxy部门,jsj专业的老师,2002-8月入职。

要求记录输出信息并说明实验步骤和解决方法!

7、问题:何为继承二义性,在本实验中哪个地方存在二义性,你是如何解决的?

继承的概念:派生类拥有基类的数据成员和成员函数。

继承方式:公有继承、保护继承、私有继承。

派生类对基类成员的访问形式:通过派生类对象直接访问基类成员,在派生类成员函数中直接访问基类成员,通过基类名字限定访问被重载的基类成员名。

类对象成员的构造:先构造成员,再构造自身(调用构造函数)。

派生类对象的构造:先构造基类,再构造成员,最后构造自身(调用构造函数)。

基类构造顺序由派生层次决定:最远的基类最先构造。

成员构造顺序和定义顺序相同。

析构函数的析构顺序与构造相反。

虚拟基类在派生类中只存在一份拷贝,解决了基类数据成员的二义性问题。

#include

using namespace std;

const int SIZE=1001;

class CPeople

{

protected:

char *name;

char *sex;

int age;

public:

/*

CPeople()

{

name = new char[SIZE];

sex = new char[SIZE];

}*/ //与下面的构造函数重复下同

CPeople(char* _name="No", char* _sex="No", int _age=0)

{

name = new char[strlen(_name)+1];

if(name) strcpy(name, _name);

sex = new char[strlen(_sex)+1];

if(sex) strcpy(sex, _sex);

age = _age;

}

~CPeople() {delete []name; delete []sex;}

char* Get_name() {return name;}

char* Get_sex() {return sex;}

int Get_age() {return age;}

void Print()

{

cout<<"name :"<

cout<<"sex :"<

cout<<"age :"<

}

};

class CStudent: public virtual CPeople //虚拟继承CPeople为虚拟基类{

protected:

int stu_num;

char *intime;

int inscore;

public:

//CStudent() {intime = new char[SIZE];}

CStudent(char* _name="No", char* _sex="No", int _age=0, int _stu_num=0, char* _intime="0000", int _inscore=0) :

CPeople(_name, _sex, _age)

{

stu_num = _stu_num;

intime = new char[strlen(_intime)+1];

if(intime) strcpy(intime, _intime);

inscore = _inscore;

}

~CStudent() {delete []intime;}

char* Get_intime() {return intime;}

int Get_stu_num() {return stu_num;}

int Get_inscore() {return inscore;}

void Print()

{

CPeople::Print();

cout<<"student number :"<

cout<<"enroll time :"<

cout<<"enroll score :"<

}

};

class CGraduate: public CStudent

{

protected:

char *dir;

char *tutor;

public:

/*

CGraduate()

{

dir = new char[SIZE];

tutor = new char[SIZE];

}*/

CGraduate(char* _name="No", char* _sex="No", int _age=0, int _stu_num=0, char* _intime="0000", int _inscore=0, char* _dir="No", char* _tutor="No") :

CPeople(_name, _sex, _age),

CStudent(_name, _sex, _age, _stu_num, _intime, _inscore)

{

dir = new char[strlen(_dir)+1];

if(dir) strcpy(dir, _dir);

tutor = new char[strlen(_tutor)+1];

if(tutor) strcpy(tutor, _tutor);

}

//初始化成员列表** 重要

~CGraduate() {delete []dir; delete []tutor;} //析构时只析构自己的

char* Get_dir() {return dir;}

char* Get_tutor() {return tutor;}

void Print()

{

CStudent::Print(); //调用CStudent中的Print

cout<<"research direction :"<

cout<<"tutor :"<

}

};

class CTeacher: public virtual CPeople //虚拟继承CPeople为虚拟基类

{

protected:

char *job;

char *depart;

char *worktime;

public:

/*

CTeacher()

{

job = new char[SIZE];

depart = new char[SIZE];

worktime = new char[SIZE];

}*/

CTeacher(char* _name="No", char* _sex="No", int _age=0, char* _job="No", char* _depart="No", char* _worktime="No") :

CPeople(_name, _sex, _age)

{

job = new char[strlen(_job)+1];

if(job) strcpy(job, _job);

depart = new char[strlen(_depart)+1];

if(depart) strcpy(depart, _depart);

worktime = new char[strlen(_worktime)+1];

if(worktime) strcpy(worktime, _worktime);

}

~CTeacher() {delete []job; delete []depart; delete []worktime;}

char* Get_job() {return job;}

char* Get_depart() {return depart;}

char* Get_worktime() {return worktime;}

void Print()

{

CPeople::Print();

cout<<"job :"<

cout<<"department :"<

cout<<"worktime :"<

}

};

class CGradonWork: public CGraduate, public CTeacher

{

public:

CGradonWork(char* _name="No", char* _sex="No", int _age=0, int _stu_num=0, char* _intime="0000", int _inscore=0, char* _dir="No", char* _tutor="No", char* _job="No", char* _depart="No", char* _worktime="No") :

CPeople(_name, _sex, _age),

CTeacher(_name, _sex, _age, _job, _depart, _worktime),

CGraduate(_name, _sex, _age, _stu_num, _intime,_inscore, _dir, _tutor)

{}

//必须要初始化自己的两个基类,还有两个基类的虚拟基类

~CGradonWork() {}

void Print()

{

CGraduate::Print();

cout<<"job :"<

cout<<"department :"<

cout<<"worktime :"<

}

};

int main()

{

cout<<"class CPeople-->>\n";

CPeople by1("baiyang","male",21);

by1.Print();

cout<<"****************"<

cout<<"class CStudent-->>\n";

CStudent by2("baiyang","male",21,28,"2009",100);

by2.Print();

cout<<"****************"<

cout<<"class CGraduate-->>\n";

CGraduate by3("baiyang","male",21,28,"2009",100,"software","crq");

by3.Print();

cout<<"****************"<

cout<<"class CGradonWork-->>\n";

CGradonWork

by4("baiyang","male",21,28,"2009",100,"software","crq","technology","ACM","all day");

by4.Print();

//by4.CTeacher::Print();

//在多继承方式下,派生类继承了多个基类的成员,当两个不同基类拥有同名成员时,容易产生名字冲突问题。

//即Print()函数,可以通过这样的方式调用CTeacher中的Print成员函数

cout<<"****************"<

cout<<"class CTeacher-->>\n";

CTeacher crq("crq","male",35,"coach","ACM","all day");

crq.Print();

cout<<"****************"<

return 0;

}

继承与组合(也称合成)是C++实现代码重用的两种主要方法。通过继承,派生类可以获得基类的程序代码,从而达到代码重用的目的。而组合则体现了类之间的另一种关系,是指一个类可以包容另外的类,即用其他类来定义它的对象成员。

虽然代码量比较大,但是思路是很清晰的。

明确每个派生类的基类(虚基类时,要注意虚基类的初始化),以及基类成员在派生类中的访问权限。

继承和派生实验报告

实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1)

(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。

2. #include #include using namespace std; #define PI 3.14159 class Point{ friend class Line; protected: double x, y ; public: Point(){x = 0 ; y = 0 ; } Point(double xv,double yv){ x = xv; y = yv; } double Area(){return 0;} void Show() { cout<<"x="<

实验四 继承与派生讲解学习

实验四继承与派生

实验四派生类与继承 【实验类型】验证性实验【实验课时】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() {

C++语言程序设计实验答案_继承与派生教学提纲

C++语言程序设计实验答案_继承与派生

实验07 继承与派生(4学时) (第7章继承与派生) 一、实验目的 二、实验任务 7_1 声明一个基类Animal。 有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。 7_2 声明一个基类BaseClass。 有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 7_3 声明一个车(vehicle)基类。 具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。

7_4 以实验6中的People(人员)类为基类。 派生出student(学生)类,添加属性:班号char classNo[7]; 派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser; 从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。 类之间的关系如图7-1所示。 图7-1 类图

实验六继承与派生

继承与组合 一、实验目的 1.了解继承在面向对象程序设计中的重要作用。 2.进一步理解继承与派生的概念。 3.掌握通过继承派生出一个新的类的方法。 4.了解虚基类的作用和用法。 5.掌握类的组合 二、实验内容 1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 (1) #include using namespace std; class A {public: A(){cout<<"A::A() called.\n";} virtual ~A(){cout<<"A::~A() called.\n";} }; class B:public A {public: B(int i) { cout<<"B::B() called.\n";

buf=new char[i]; } virtual ~B() { delete []buf; cout<<"B::~B() called.\n"; } private: char *buf; }; void fun(A *a) { cout<<"May you succeed!"<

A::A() called. B::B() called. May you succeed! B::~B() called. A::~A() called. (2) #include using namespace std; class A{ public: A(int a,int b):x(a),y(b){ cout<<"A constructor..."<

实验四:派生类和继承(一)

福建农林大学金山学院实验报告 系(教研室):信息与机电工程系专业:计算机科学与技术年级: 实验课程:面向对象程序设计姓名:学号:  实验室号 计算机号 实验时间:指导教师签字:成绩: 实验4 派生类和继承(一) 一、实验目的和要求 (1)掌握派生类的声明与定义方法,进一步理解类的继承的概念,能够定义和使用类的继承关系。 (2)熟悉公有派生和私有派生的访问特性。 二、实验内容和原理 1、程序分析题(写出程序的输出结果,并分析结果)。

2、(1)定义一个基类animal,该类具有私有整型成员变量age,weight,构造派生类dog公有继承animal,dog类新增私有成员变量color,新增成员函数SetAge(int n)中直接给age赋值,新增成员函数SetWeight(int m)中直接给weight赋值,查看编译结果,并分析结果。(2)将类animal中的age和weight为公有成员,重做第一步,并分析结果。(3)将类animal中的age和weight为保护成员,重做第一步,并分析结果。(4)将派生类dog的继承方式改为私有继承方式和保护继承方式重做以上各小题,并分析结果。 三、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、Visual C++ 6.0 四、算法描述及实验步骤 2.1 #include class animal {private:int age,weight;}; class dog:public animal

{private:char color[10]; public: int SetAge(int n) {age=n;return n;} int SetWeight (int m) {weight=m;return m; } }; int main() { int x,y; dog a; cout<<"请输入这条狗的岁数="; cin>>x;cout< class animal {public:int age,weight;}; class dog:public animal {private:char color[10]; public: int SetAge(int n) {age=n;return n;} int SetWeight (int m)

类的继承与派生综合题

1. 类的继承与派生综合题1 题目描述 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。 要求: a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其他数据成员。 b.各类人员的实发工资公式如下: 员工实发工资=基本工资+奖金*出勤率 销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例 经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例 销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例 c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 主函数如下: int main() { Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000); Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000); SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000); objsale.Output(); cout<< "销售员的实发工资:" << " "; cout<

实验四 继承与派生

实验四继承与派生 一、实验目的: 掌握利用单继承和多重继承的方式定义派生类的方法; 深刻理解在各种继承方式下构造函数和析构函数的执行顺序; 理解和掌握公有继承,私有继承和保护继承对基类成员的访问机制; 理解虚基类的概念以及引入虚基类的目的和作用。 二、实验时间: 三、实验地点: 四、实验内容: 1.运行以下程序,并对运行结果进行分析 #include"stdafx.h" #include using namespace std; class base{ int n; public: base(int a) {cout<<"constructing base class"<

c++实验8继承与派生上机练习题

1. 定义一个哺乳动物类Mamma,l 并从中派生出一个狗类Dog,要求: ( 1) 添加Dog 类的颜色数据成员,访问属性为私有,通过函数来对颜色进行设置和获取。 ( 2) 分别为基类和派生类添加相应的构造函数(有参、无参) 测试。 class Mammal { protected: int itsAge; int itsWeight; public: int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal { // 定义Dog 类的数据成员和成员函数 }; 改: #include #include using namespace std; class Mammal { protected: int itsAge; int itsWeight; public: Mammal(); ~Mammal(); int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal {下面给出Mamma类的定义,SetColor 和GetColor 成员和析构函数,并进行

c++实验三继承和派生类(附答案)

实验三继承和派生类 实验目的和要求 1.理解类的继承的概念,能够定义和使用类的继承关系。 2.掌握派生类的声明与定义方法。 3.熟悉公有派生和私有派生的访问特性。 4.学习虚基类在解决二义性问题中的作用。 实验内容 1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 (1) #include<> class A { public: A() { cout<<"A::A() called.\n"; } ~A() { cout<<"A::~A() called.\n"; } }; class B:public A { public: B(int i) { cout<<"B::B() called.\n"; buf=new char[i]; } ~B() { delete []buf; cout<<"B:~B() called.\n"; } private: c har *buf; }; void main() {

B b(10); } (2) #include<> class A { public: A(int a,int b):x(a),y(b) { cout<<"A constructor..."<

继承与派生(实验题)

实验五继承与派生 一、实验目的 (1)了解继承在面向对象程序设计中的重要作用。 (2)进一步理解继承与派生的概念。 (3)掌握通过继承派生出一个新的类的方法。 二、实验内容 设计: 某小型公司的人员:技术人员Technician,推销员saleman; 1、类x 1)Employee类: 基本信息:编号、姓名、性别、出生日期、职位,薪水等; 其中出生日期使用自定义的Date(日期)类; 基本信息为private属性,成员函数为public属性;多个构造函数(缺省构造、带参数的构造);可以从外部访问类成员的友元函数; 2)Date类: 成员变量:年、月、日 成员函数:SetYear(int year)、SetMonth(int month)、SetDay(int day)、GerYear()、GetMonth()、GetDay() 3)派生类Technician:新增属性:工作时间 4)派生类saleman:新增属性:销售额、所属部门 2、基本功能 1)人员信息的录入; 2)人员信息的显示;

3)计算并显示个人月薪: 月薪计算方法:技术人员按每小时30元领取月薪;推销员的月薪按当月销售额的4% 提成; 4)计算当月公司的总销售额并输出; 5)用对象数组保存职工对象; 6)可以修改人员的基本信息,如:姓名、职位等; 实验提示 1、在基类中,除了定义构造函数和析构函数,还应统一定义对各类人员信息应有的操作,规范类族中各派生类的基本行为。但是各类 人员的月薪计算犯法不同,不能在基类employee中统一确定计算方法。各类人员信息的显示内容不同,同样不能在基类employee 中统一确定显示方法。因此在基类中实现上述功能(计算和显示)的函数体应为空,在派生类中根据同名覆盖原则定义各自的同名函数实现具体功能。 2、将基类employee分两个独立文档:employee.h(类声明头文件)和employee.cpp(类实现文件) 报告的书写注意事项: 报告包括实验目的,实验内容,实验设计(指出主要函数或者类,必要时附流程图),核心代码,运行结果,心得体会。

实验四 继承与派生(学生)

实验四:继承与派生(2) 一、实验目的和要求 (1)理解单继承与多继承,掌握多继承派生类的声明方式。 (2)掌握多继承派生类构造函数的定义的一般形式。 (3)掌握多继承构造函数与析构函数的执行顺序。 (4)掌握含有对象成员的派生类构构造函数的特点。 (5)理解类的继承可能发生的“二义性”问题(同名成员的访问) 二、知识点回顾 多继承构造函数定义的一般形式如下: 派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n) { // 派生类新增成员的初始化语句 } class B: public A class D:public A, public B, public C { { B(int i,int j):A( i) { ….. D(int i,int j,int k, int l):A( i),B(j ),C( k),ob(l ) } { ……. } }; }; ……. D obj(1,2,3,4); 多重继承构造函数的执行顺序与单继承下的构造函数执行顺序相同: (1)先执行基类的构造函数。 (2)再执行对象成员的构造函数。 (3)最后执行派生类的构造函数体。 说明:处于同一层的各个基类的构造函数的执行顺序, 取决于声明派生类时所指定的各个基类的顺序, 与派生类构造函数中所定义的成员初始化列表中的顺序并没有关系. 说明:派生类构造函数后如未列出基类构造函数的调用,默认调用的是无参或带默认参数的构造函数。 三、实验内容 1. P191题4.15输入下列程序,分析程序运行结果........ 。 理解多重继承(画出类的层次结构图),注意派生类构造函数的定义格式,注意构造函

实验四继承与派生

实验四派生类与继承 【实验类型】验证性实验【实验课时】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:

实验4 派生与继承

实验4 派生与继承 一、实验目的 理解继承思想,掌握继承的语法,体会不同继承方式下派生类对基类成员的访问权限。 二、实验内容: 1.编写一个程序,实现字符串的相关操作。要求: 在已有简单串类myString的基础上派生字符串类String1,类中包含输入字符串、返回字符串长度及内容等功能,并能实现字符串连接与比较(不用库函数); 设计一个具有编辑功能的串类String2,它从String1类派生而来。成员函数能够在在字符串指定位置处实现如下操作:插入字符串、替换和删除某个字符,并能查找子串。 类的设计可参考如下UML图:

2. 综合性的实验,设计数组类族。要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。实验内容给出的是一个完整的程序,4个题目实际是类等级。同学也可以在此基础上发挥增加新的内容。 (1)定义一个基类MyArray,基类中可以存放一组数组。 Class Myarray { int *alist; int length; public: Myarray( int leng); Myarray(const Myarray&); ~myarray(); void input(); void display(); }; 编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。并进行调试。 (2)定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。进行调试。(3)定义一个类revarray继承自myarray, 使数组按反序存放,并输出。进行调试。 (4)定义一个类Safearray继承自averarray和revarray,并保证访问数组不会越界。在继承过程中声明为虚基类,体会虚基类在解决二义性中的问题中的作用。调试中可以试一试不用虚基类出现的问题。(提交书面作业) 3. 设计一个学生和教师类,学生数据有编号、姓名、班级和成绩;教师数据有编号、姓名、职称和部门;要求:运用继承的思想实现相关功能:对学生和教师的数据进行输入和显示,类中包括各种构造函数,思考如何在派生类的构造函数中初始化基类的成员。 4. 读程序,回答问题(提交书面作业) #include using namespace std;

实验2继承与派生讲解

继承与派生实验2 实验目的2.1 类的继承,能够定义和使用类的继承关系。1.熟练掌握派生类的声明与实现方法。2.掌握 3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。虚基类在解决二义性问题中的作用。 4.理解2.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。 Visual C++ 6.0等集成开发环境软件。需要一台主算机,其中安装有 2.3 实验内容 1.先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。 // 文件名: main.cpp #include // 预处理命令 // 使用标准命名空间std using namespace std; class A { public: : 公有函数// ?笩挠畯??尠构造A << endl; } // 构造函数 // A << endl; } 析构函数???潣瑵?? 析构}; class B: public A { public: : 公有函数// // 构造函数B << endl; } ?笩挠畯??尠构造// 析构B << endl; } 析构函数???潣瑵?? }; class C: public B { public: : // 公有函数// 构造函数C << endl; } 构造?笩挠畯??尠 C << endl; } 析构???潣瑵?? 析构函数// }; main(void) 主函数// int main(void) { 定义对象C obj; //

,输出系统提示信息调用库函数system( )// system(PAUSE); 0, 返回操作系统// 返回值return 0; } 2.先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。// 文件名: main.cpp #include // 预处理命令 using namespace std; // 使用标准命名空间std class A { protected: // 数据成员: int a; // 数据成员 public: // 公有函数: A(int x): a(x){ } // 构造函数 void Show() const{ cout << a << endl; } // 显示a之值 }; class B { protected: // 数据成员: int b; // 数据成员 public: // 公有函数: B(int x): b(x){ } // 构造函数 void Show() const{ cout << b << endl; } // 显示a与b之值 }; class C: public A, public B { public: // 公有函数: C(int x, int y): A(x), B(y){ } // 构造函数 void Show() const // 显示b之值 { cout << a << , << b << endl; } }; int main(void) // 主函数main(void) {

实验二 类的继承与派生

实验二类的继承与派生 一、实验目的 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; }

C++继承与派生实验报告

应用数学学院信息与计算科学(信息计算)专业 1 班、学号3111008106 姓名吴伟栓教师评定_________________ 实验题目继承与派生 一、实验目的与任务 实验目的: (1)学习声明和使用类的继承关系,声明派生类。 (2)熟悉不同继承方式下对基类成员的访问控制。 (3)学习利用虚基类解决二义性问题。 实验任务: (1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。 (2)声明一个基类BaseClass,有整形成员变量Number,构造其派生类 DerivedClass,观察构造函数和析构函数的执行情况。 (3)声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop 等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle 和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 (4)(选做)从实验六中的people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。 二、实验步骤 (1)编写程序声明基类Animal,成员变量age声明为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:error

C实验报告-实验4继承与派生

实验4 继承与派生 一、实验目的和要求 (1)掌握派生类的定义方法和派生类构造函数的定义方法。 (2)掌握不同继承方式的情况下,基类成员在派生类中的访问权限。 (3)掌握在多继承方式的情况下,构造函数与析构函数的调用时机与顺序。 二、实验内容和原理 (1)实验指导书P86 1~2任选一题。 (2)实验指导书P89 3~4任选一题。 三、实验环境 联想计算机,Windows XP操作系统,Visual C++ 6.0 四、算法描述及实验步骤 (1)输入源程序。 (2)检查程序有无错误(包括语法错误和逻辑错误),有则改之。 (3)编译和连接,仔细分析编译信息,如有错误应找出原因并改正之。 (4)运行程序,分析结果,在原有程序得出正确结果后,修改程序,将其改写为在类模板外定义,再按第(3)步骤运行。 (5)将调试好的程序保存在自己的用户目录中,文件名自定。 五、调试过程

(1)2 (2)4 六、实验结果 (1)2 (2)4 七、总结 (1)掌握构造函数和析构函数的定义方法 (2)构造函数调用顺序:先调用所有基类的构造函数,然后调用派生类的构造函数; (3)析构函数调用顺序:先调用派生类的析构函数,然后调用基类的析构函数,其顺序正好与构造函数调用顺序相反。 八、附录: (1)代码如下 #include using namespace std; class Base1 {public: Base1(){cout<<"constructing Base1"<

相关文档
相关文档 最新文档