实验2 继承与派生
c 继承与派生实验报告
c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
C 继承与派生实验报告
C 继承与派生实验报告C 继承与派生实验报告引言:在面向对象的编程中,继承与派生是重要的概念。
通过继承,我们可以从已有的类中派生出新的类,并且可以在新的类中添加额外的属性和方法。
本实验旨在通过实际的编程实践,深入理解C语言中的继承与派生。
实验过程:首先,我们创建了一个基类Animal,其中包含了一个成员变量name和一个成员函数eat。
然后,我们创建了两个派生类Dog和Cat,它们分别继承了Animal类,并且在其中添加了各自特有的成员函数bark和meow。
接着,我们创建了一个对象dog和一个对象cat,并分别调用了它们的成员函数eat、bark 和meow。
实验结果:通过运行程序,我们可以看到dog对象调用了eat和bark函数,而cat对象调用了eat和meow函数。
这说明继承与派生的机制正常工作,派生类可以继承基类的属性和方法,并且可以在派生类中添加新的属性和方法。
实验分析:继承与派生是面向对象编程的重要概念,它可以使得代码的复用性更高,同时也增加了代码的灵活性。
通过继承,派生类可以继承基类的属性和方法,这样可以减少代码的冗余,并且可以在派生类中添加新的功能。
在本实验中,Dog 和Cat类分别继承了Animal类,这样它们就拥有了相同的属性name和方法eat。
然后,通过在派生类中添加新的方法bark和meow,我们可以实现不同的行为。
继承与派生的应用:继承与派生在实际的软件开发中有着广泛的应用。
例如,在一个图形界面程序中,可以定义一个基类Widget,它包含了一些基本的属性和方法,然后可以通过派生类Button和TextBox来创建具体的按钮和文本框。
这样,我们可以通过继承和派生的方式,实现不同的界面元素,并且可以在派生类中添加新的功能,如按钮的点击事件和文本框的输入验证。
继承与派生的注意事项:在使用继承与派生的过程中,我们需要注意一些问题。
首先,派生类可以访问基类的公有成员,但不能访问基类的私有成员。
实验2继承与派生讲解
实验2 继承与派生2.1 实验目的1.熟练掌握类的继承,能够定义和使用类的继承关系。
2.掌握派生类的声明与实现方法。
3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。
4.理解虚基类在解决二义性问题中的作用。
2.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。
需要一台主算机,其中安装有Visual C++ 6.0等集成开发环境软件。
2.3 实验内容1.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
// 文件名: main.cpp#include <iostream> // 预处理命令using namespace std; // 使用标准命名空间stdclass A{public:// 公有函数:A(){ cout << "构造A" << endl; } // 构造函数~A(){ cout << "析构A" << endl; } // 析构函数};class B: public A{public:// 公有函数:B(){ cout << "构造B" << endl; } // 构造函数~B(){ cout << "析构B" << endl; } // 析构函数};class C: public B{public:// 公有函数:C(){ cout << "构造C" << endl; } // 构造函数~C(){ cout << "析构C" << endl; } // 析构函数};int main(void) // 主函数main(void){C obj; // 定义对象system("PAUSE"); // 调用库函数system( ),输出系统提示信息return 0; // 返回值0, 返回操作系统}2.先阅读下列程序,写出执行结果。
c派生类与继承实验报告
实验2 派生类与继承实验课程名:面向对象程序设计(C++)专业班级:学号::实验时间:实验地点:指导教师:二、实验内容一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。
对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。
试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。
实验代码如下:#include<iostream>using namespace std;class Geometry{public:CircleradiumsCircle()~Circle() BallBall()~Ball() GeometryGeometry()~Geometry()GetArea()GetPerimeter()Getcolume()show()Column Column()~Column()Rectangle Rectangle() ~Rectangle()Column column(1,2,3);column.show();return 0;}运行结果:代码分析:1)首先定义基类Geometry,在定义基类的派生类Circle,Rectangle再定义以Circle,Rectangle为基类的派生类Column,以及以Circle为基类的派生类Ball;2)在定义派生类时用构造函数初始化私有成员;3)最后用类的对象来调用类函数;二、设计如下类:(1)建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端,内含两个Point类的对象;建立Triangle类,表示一个三角形,内含三个Line类的对象构成一个三角形。
(2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制(3)设计Triangle类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。
继承和派生实验报告
实验目的与要求:1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握内联函数和默认函数。
4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
实验过程及内容:1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。
①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。
编程测试所定义的类体系。
本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。
2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。
要求计算圆柱的底面积、侧面积、全面积和体积。
请编写所有完整的成员函数,并编写主函数进行验证。
数据处理1.(1)(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。
(3)在Line类中添加两个数据成员。
2. #include <iostream>#include <cmath>using namespace std;#define PI 3.14159class 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="<<x<<' '<<"y="<<y<<endl;}};class Circle :public Point{protected:double radius;public:Circle(){ x = 0; y = 0; radius = 0; }Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数radius = vv;}Circle(Circle & cir):Point(cir){ //按赋值兼容规则cir可为Point实参radius=cir.radius;}Circle & operator=(Circle & cir){this->Point::operator=(cir); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式radius=cir.radius;return *this;}double Area(){return PI*radius*radius;}void Show()cout<<"x="<<x<<' '<<"y="<<y<<" radius="<<radius<<endl; //访问基类的数据成员}};class Cylinder:public Circle {double high;public:Cylinder(){ x = 0; y = 0; radius = 0;high=0; }Cylinder(double xv,double yv,double vv,double kv):Circle(xv,yv,vv){ //调用基类构造函数high=kv;}Cylinder(Cylinder & cyl):Circle(cyl){ //按赋值兼容规则cyl可为Cylinder实参high=cyl.high;}Cylinder & operator=(Cylinder & cyl){this->Circle :: operator=(cyl); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式high=cyl.high;return *this;}double ceArea(){return 2*PI*radius*high;}double quArea(){return ceArea()+2* Area();}double volume(){return Area()*high;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<' '<<"high="<<high<<endl; //访问基类的数据成员};class Line{Point start,end; //对象成员public:Line(){} //对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2){ }double GetLength() {return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();}};int main(){Point pt(0,0);Circle cl1(100,100,10),cl2(cl1),cl3;Cylinder h1(50,50,20,30),h2(h1),h3;Line ln1(0,0,100,100),ln2;cout<<"点面积:"<<pt.Area()<<endl;pt.Show();cout<<"cl1圆面积:"<<cl1.Area()<<endl;cl1.Show();cout<<"cl2圆面积:"<<cl2.Area()<<endl;cl2.Show();cl3=cl1;cout<<"cl3圆面积:"<<cl3.Area()<<endl;cl3.Show();cout<<"h1底面积:"<<h1.Area()<<endl;cout<<"h1侧面积:"<<h1.ceArea()<<endl;cout<<"h1全面积:"<<h1.quArea()<<endl;cout<<"h1体积:"<<h1.volume()<<endl;h1.Show();cout<<"h2底面积:"<<h2.Area()<<endl;cout<<"h2侧面积:"<<h2.ceArea()<<endl;cout<<"h2全面积:"<<h2.quArea()<<endl;cout<<"h2体积:"<<h2.volume()<<endl;h2.Show();h3=h1;cout<<"h3底面积:"<<h3.Area()<<endl;cout<<"h3侧面积:"<<h3.ceArea()<<endl;cout<<"h3全面积:"<<h3.quArea()<<endl;cout<<"h3体积:"<<h3.volume()<<endl;h3.Show();cout<<"线面积:"<<ln1. Area()<<'\t'<<"线长度:"<<ln1. GetLength()<<endl;ln1.Show();ln2.Show();return 0;}实验结论:通过这次实验,我对类的继承和派生,派生类构造函数初始化基类成员和对象成员的方法,以及赋值兼容原则有了更深的理解。
实验二 类的继承和派生
实验二类的继承和派生1.实验目的(1)掌握利用单继承和多继承的方式定义派生类的方法。
(2)深刻理解在各种继承方式下构造函数和析构函数的执行顺序。
(3)理解和掌握公有继承、私有继承和保护继承对基类成员的访问机制。
(4)理解虚基类的目的和作用。
2.实验内容(1)声明一个圆类作为基类,含成员数据半径R;有成员函数:构造函数实现对基类成员数据的初始化、计算圆面积的成员函数、输出的成员函数,要求输出圆半径R。
把圆类作为基类,通过公有继承,派生圆柱体类,派生类新增成员数据有高(H);新增成员函数有构造函数、计算圆柱体体积的函数、输出所有成员的函数。
main()完成派生类对象的定义和相关函数的测试。
(2)声明一个学生类,有成员函数:学号、姓名、性别、年龄,要求有如下成员函数:构造函数,输出所有成员的函数。
声明一个课程类,有成员数据:课程编号、课程名称、学时数,要求有如下成员函数:构造函数,输出所有成员的函数。
将学生类和课程类作为基类,通过公有继承,派生选课类,派生类新增成员数据有:成绩;新增成员函数有:构造函数,输出所有成员的函数。
main()完成派生类对象的定义和相关函数的测试。
(3)设计一个汽车类Vehicle,包含数据成员车轮和重量,由它派生出类Car 和类Truck,前者包含载客数,后者包含载重量。
编写程序实现。
3.实验要求(1)独立完成实验。
(2)实验前需先预先浏览实验指导书,编好源程序。
(3)实验过程中尽量独立思考,培养分析问题和解决问题的能力。
(4)实验完毕后书写实验报告,实验报告内容包括:实验内容、结果分析以及本次实验的心得体会。
要求将程序源代码和运行时的输入输出数据情况书写在实验内容部分,并对程序的输出结果进行分析,说明为什么能得出相应的结果(如果不能输出预期结果,需要分析说明其原因)。
实验二_1010
实验二继承和派生实验内容:1. 上机验证课本上的第四章习题中4.8~4.19。
(结果直接写在课本上,不要求提交)。
2. 完成课本page196的编程题4.21。
(按课本上给的题目编号(如lx4_21.cpp)命名)补充:1. 声明Book与Ruler两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。
(bsy2_1.cpp)2. 假设图书馆的图书包含书名、编号、作者属性,读者包含姓名和借书证属性,每位读者最多可借5本书,编写一个程序列出某读者的借书情况。
(提示:可建立一个公共的基类有编号和姓名,图书和读者继承自这个基类)(bsy2_2.cpp)3. 利用继承性与派生类来管理学生和教师档案。
假设要管理下述几类人员的如下一些有关数据。
teacher(教师)类:姓名、性别、年龄、职称、担任课程;student(学生)类:姓名、性别、年龄、学号、系别;gradstudent(研究生)类:姓名、性别、年龄、学号、系别、导师。
要求每个类只设立构造函数以及显示类对象数据的成员函数。
编写主函数,说明有关类对象,并对其类成员函数进行简单使用。
(bsy2_3.cpp)4. 某公司财务部需要开发一个计算雇员工资的程序。
该公司有3类员工,工人的工资为每小时工资额乘当月工作时数再加上工龄工资;销售员工资为每小时工资额乘当月工作时数加上销售额加上工龄工资,其中,销售额提成等于该销售员当月售出商品金额的1%;管理人员工资为基本工资再加上工龄工资。
工龄工资就是雇员在该公司工作的工龄,每增加一年,月工资就增加35元。
请用面向对象方法分析、设计这个程序,并通过main函数测试所设计的类。
(bsy2_4.cpp)要求:1. 编程题按课本上给的题目编号(如sy1_1.cpp)命名。
2. 上传作业时,请建立以“班级+学号+姓名”命名的文件夹,将所有的内容放在文件夹中。
(作业下载:217机房:ftp://192.168.1.217:1000找到“贺海晖”文件夹作业上传:217机房:ftp://192.168.1.217:2000/hhh)。
C++实验2--继承和派生计本10级)约
};
class Salesmanager: protected Salesman,public Manager
{
public:
float saleroom;
Salesmanager(char *number1,char *name1,float salary1,float salary2,int wy,float saleroom,float sale1,float sale2):
};
for(i=0;i<3;i++)
{
tec[i].show();
}
}
{
Employee::show();
cout<<" sale is :"<<sale<<endl;
cout<<"the total salary is:"<<salary<<endl;
cout<<"*********"<<endl;
}
};
class Salesman:virtual protected Employee
{
Employee::show();
cout<<"time is:"<<time<<endl;
cout<<"the toal salary is:"<<time*salary<<endl;
cout<<"*********"<<endl;
}
};
void main()
继承与派生实验报告
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
C++继承与派生实验报告
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(助教生)类,注意虚基类的使用。
实验二继承机制实验报告
浙江理工大学信息学院实验指导书实验名称:类得继承机制得实现学时安排:3实验类别:设计性实验实验要求:1人1组学号: 姓名 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目得1、掌握单继承与多重继承得概念。
2、理解不同得继承类型:public、protected与private,掌握何时使用何种继承类型。
3、掌握类层次中构造函数得定义方式与建立对象时构造与析构次序二、实验原理介绍通过继承机制实现对类功能得扩展,合理设计派生类得构造函数、成员函数。
三、实验设备介绍软件需求: windows或linux下得c++编译器硬件需求:对于硬件方面得要求,建议配置就是Pentium III 450以上得CPU处理器,64MB以上得内存,200MB得自由硬盘空间、CD-ROM驱动器、能支持24位真彩色得显示卡、彩色显示器、打印机。
四、实验内容实现对第一次实验结果Elevator类得功能扩展。
在Elevator类已有功能得基础上派生AdvancedElevator类。
AdvancedElevator类可以实现当多人在不同楼层等待乘坐上行或下行得同一部电梯时,能够合理得根据乘坐人得需求对电梯经停得楼层进行排序。
要求:1、为了实现上得方便性,我们假设同一组要求乘坐电梯得乘客或者都就是上行,或者都就是下行。
2、在主函数中对该类得功能进行测试,测试方法就是首先选择在某一时间段一组要乘坐电梯得乘客就是上行还就是下行,然后输入组中乘客得人数及每一个乘客所在楼层与目得楼层,由AdvancedElevator类实例化后得电梯对象在运作得过程中,如果电梯就是上行,则能根据乘客所在得楼层与目得楼层从下向上依次停靠;如果电梯就是下行,则能根据乘客所在得楼层与目得楼层从上向下依次停靠.3、在测试得过程中,还需要注意测试当多个用户在同一楼层或多个用户得目得楼层为同一楼层时情况得处理.提示:为了方便描述乘客,我们可以定义一个Person类,主要描述每一个乘客所在楼层与目得楼层。
实验二 继承和派生
实验二运算符重载、继承和派生【实验目的】1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解重载运算符的意义。
7、掌握用成员函数、友元函数重载运算符的特点。
8、掌握重载运算符函数的调用方法。
【实验内容】1、上机分析下面程序,掌握运算符重载的方法。
#include <iostream.h>class Complex{friend Complex operator+( const double &d, const Complex &c );friend Complex operator-( const double &d, const Complex &c );double m_fReal, m_fImag;public:Complex( const double &r = 0, const double &i = 0): m_fReal( r ), m_fImag( i ){}Complex( const Complex &c ): m_fReal( c.m_fReal ), m_fImag( c.m_fImag ){}double GetReal() const{return m_fReal;}double GetImag() const{return m_fImag;}Complex& operator=( const Complex &c ){if( this == &c ){return *this;}m_fReal=c.m_fReal;m_fImag=c.m_fImag;return *this;}Complex operator+( const Complex &c ){return Complex( m_fReal+c.m_fReal, m_fImag+c.m_fImag );}Complex operator-( const Complex &c ){return Complex( m_fReal-c.m_fReal, m_fImag-c.m_fImag );}Complex operator+( const double &d ){return Complex( m_fReal+d, m_fImag );}Complex operator-( const double &d ){return Complex( m_fReal-d, m_fImag );}};Complex operator+( const double &d, const Complex &c ){return Complex( d + c.m_fReal, c.m_fImag );}Complex operator-( const double &d, const Complex &c ){return Complex( d - c.m_fReal, c.m_fImag );}int main(){Complex c1( 3.3, 4.4 );Complex c2( 5.5, 2.2 );Complex c3;c3 = c1 + c2;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = c1 - c2;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = c1 + c2;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = c1 + 1.1;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = c1 - 1.1;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = 9.9 + c1;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;c3 = 9.9 - c1;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;( c3 = c1 ) = c2;cout << "C3 = " << c3.GetReal() << "+i" << c3.GetImag() << endl;return 0;}2、上机分析下面程序,理解继承的概念。
C 继承与派生实验报告
C 继承与派生实验报告1. 引言继承与派生是面向对象编程中的基本概念之一,C语言作为一门面向过程的编程语言,也支持继承与派生的概念。
本实验旨在通过编写代码演示C语言中的继承与派生的使用方法,加深对这一概念的理解。
2. 继承与派生的概念继承是一种面向对象编程中的重要概念,通过继承,派生类可以继承基类的属性和方法。
在C语言中,继承是通过结构体嵌套的方式实现的。
派生是继承的一种特殊形式,通过派生,派生类可以在基类的基础上增加新的属性和方法。
3. 实验步骤步骤一:定义基类首先,我们需要定义一个基类,基类包含一些公共的属性和方法。
在C语言中,我们可以使用结构体来定义类。
typedef struct {int x;int y;} Point;上述代码定义了一个名为Point的结构体,它包含了两个整型属性x和y。
这个结构体可以看作是基类。
步骤二:定义派生类接下来,我们可以定义派生类,派生类通过嵌套包含基类的结构体来实现继承。
typedef struct {Point base; // 基类结构体int z; // 派生类自己的属性} Point3D;上述代码定义了一个名为Point3D的结构体,它嵌套包含了基类Point的结构体,并新增了一个整型属性z。
这个结构体可以看作是派生类。
步骤三:使用派生类在定义好派生类后,我们可以使用派生类来创建对象,并调用基类的属性和方法。
int main() {// 创建对象Point3D point3d;point3d.base.x = 1;point3d.base.y = 2;point3d.z = 3;// 调用基类属性printf("x: %d\n", point3d.base.x);printf("y: %d\n", point3d.base.y);// 调用派生类自己的属性printf("z: %d\n", point3d.z);return0;}上述代码示例了如何使用派生类创建对象,并访问基类的属性和派生类自己的属性。
实验二 类的继承与派生
实验二类的继承与派生一、实验目的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 <iostream>#include <string>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<<year<<"年"<<month<<"月"<<day<<"日";}};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=;num=p.num;sex=p.sex;birthday=p.birthday;strcpy(ID,p.ID);}void input() //输入函数{cout<<"录入数据:"<<endl;cout<<"姓名:";cin>>name;cout<<"编号:";cin>>num;cout<<"性别(m/f):";cin>>sex;cout<<"生日:";birthday.set();cout<<"身份证号:";cin>>ID;ID[18]='\0';cout<<endl;}void output() //输出函数{cout<<"编号:"<<num<<endl;cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"生日:";birthday.display();cout<<endl;cout<<"身份证号:"<<ID<<endl;}~Person() //析构函数{cout<<" "<<num<<"号人员已经录入"<<endl; }};int main(){Person p1;p1.input();p1.output();return 0;}第二题#include <iostream>#include <string>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<<year<<"年"<<month<<"月"<<day<<"日";}};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=;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<<endl;}void output() //输出函数{cout<<"编号:"<<num<<endl;cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"生日:";birthday.display();cout<<endl;cout<<"身份证号:"<<ID<<endl;}~Person() //析构函数{//cout<<" "<<num<<"号人员已经录入"<<endl; }};class stduent:public Person{char classno[7];public: student(){cout<<"*************"<<endl; }void input(){Person::input();cout<<"输入学号"<<endl;cin>>classno;}void getno(){Person::output();cout<<"学号为:"<<classno<<endl;}};class teacher:public Person{char pship[11],departt[21];public :teacher(){cout<<"***********"<<endl;}void input(){Person::input();cout<<"输入职务"<<endl;cin>>pship;cout<<"输入部门"<<endl;cin>>departt;}void inputt(){cout<<"输入职务"<<endl;cin>>pship;cout<<"输入部门"<<endl;cin>>departt;}void getno(){Person::output();cout<<"职务为:"<<pship<<endl;cout<<"部门为:"<<departt<<endl;}void output (){cout<<"职务为:"<<pship<<endl;cout<<"部门为:"<<departt<<endl;}};class graduate:public stduent{char subject[21], adviser[21];public :graduate(){cout<<""<<endl;}void input(){stduent::input();cout<<"输入专业:"<<endl;cin>>subject;cout<<"输入导师:"<<endl;cin>>adviser;}void getno(){ stduent::getno();cout<<"专业为:"<<subject<<endl;cout<<"导师为:"<<adviser<<endl;}};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<<"请依次输入人员数据信息"<<endl;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.调试程序第一次调试,发现没有名字的显示。
C 继承与派生实验报告
C 继承与派生实验报告C 继承与派生实验报告引言:在计算机编程领域,继承与派生是一种重要的概念。
通过继承,我们可以构建更加复杂和灵活的程序结构,提高代码的可重用性和可维护性。
本实验旨在通过实际操作和分析,深入理解C语言中继承与派生的原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握C语言中继承与派生的语法和用法;3. 实践继承与派生的应用,加深对其理解。
实验步骤:1. 创建基类和派生类:首先,我们创建一个基类Animal,其中包含一个成员函数eat()和一个成员变量name。
然后,我们创建一个派生类Dog,继承自基类Animal,并添加一个成员函数bark()和一个成员变量breed。
2. 实现继承与派生的功能:在基类Animal中,实现成员函数eat(),用于输出动物的进食行为。
在派生类Dog中,实现成员函数bark(),用于输出狗的吠叫行为。
同时,通过继承,派生类Dog可以直接访问基类Animal中的成员变量name。
3. 测试继承与派生的效果:在主函数中,创建一个Dog对象,并调用其成员函数eat()和bark(),以验证继承与派生的功能是否正常工作。
同时,可以通过修改派生类Dog的成员变量breed,观察其对程序运行结果的影响。
实验结果与分析:通过实验,我们可以发现继承与派生的强大功能。
基类Animal提供了一种通用的行为eat(),而派生类Dog则通过添加成员函数bark(),实现了更加具体和特定的行为。
这种继承与派生的关系,使得我们可以在保留原有功能的基础上,进行灵活的扩展和定制。
此外,通过继承,派生类Dog可以直接访问基类Animal中的成员变量name。
这种继承的特性,使得派生类可以共享基类的数据,避免了重复定义和冗余代码的问题。
同时,通过修改派生类Dog的成员变量breed,我们可以看到其对程序运行结果的影响。
这种灵活性,使得我们可以根据具体需求,定制不同的派生类,实现更加个性化的功能。
继承与派生
实验4 继承与派生班级学号(最后两位)姓名成绩一、实验目的1.熟练掌握类的继承,能够定义和使用类的继承关系2.掌握派生类的声明与实现方法3.掌握类构造函数的初始化列表与作用域分辨率的使用方法4.理解虚基类在解决二义性问题中的作用.二、实验内容1.定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩。
2.声明一个哺乳动物Mammal类,再由此派生出狗Dog类,声明一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序。
3.定义一个Point类,派生出矩形类Rectangle和圆类Circle,计算各派生类对象的面积Area()。
4.设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。
5.定义一个大学生类student,函数私有数据成员:姓名、学号、校名,并为它定义带参数的构造函数,参数带缺省值的构造函数和输出数据成员值的print()公有成员函数,另定义研究生类,它以公有继承方式派生于类student,新增加“研究方向、导师名”两个私有数据成员,并定义带参数的构造函数和输出研究生数据的print()公有成员函数。
在main()函数中定义基类和派生类对象,对类进行测试。
三、实验源程序、测试与结论1.#include<iostream>#include<string>using namespace std;class person{public:person(string name_,char sex_,int age_):name(name_),sex(sex_),age(age_){}void show(){cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl;cout<<"age: "<<age<<endl;}protected:string name;char sex;int age;};class teacher:public person{public:teacher(string name_,char sex_,int age_,int j_n,string job_,int wage_):person(name_,sex_,age_),job_number(j_n),job(job_),wage(wage_){}void show1();private:int job_number;string job;int wage;};void teacher::show1(){cout<<"This teacher is: "<<endl;show();cout<<"job number: "<<job_number<<endl;cout<<"job: "<<job<<endl;cout<<"wage: "<<wage<<endl;}class student:public person{public:student(string name_, char sex_, int age_, int num_, string cla_, string major_, int score_): person(name_,sex_,age_), num(num_), cla(cla_), major(major_), score(score_){}void show2();private:int num;string cla;string major;int score;};void student::show2(){cout<<"This student is: "<<endl;show();cout<<"NO: "<<num<<endl;cout<<"class: "<<cla<<endl;cout<<"major: "<<major<<endl;cout<<"score: "<<score<<endl;}void main(){teacher t("John",'M',28,11111,"math",5000);t.show1();student s("Randy",'M',20,1210034,"BX1205","electron",100);s.show2();}2.#include<iostream>using namespace std;class Mammal{public:Mammal(){cout<<"Constructor Mammal"<<endl;}~Mammal(){cout<<"Mammal will die"<<endl;}};class Dog:public Mammal{public:Dog():Mammal(){cout<<"Constructor Dog"<<endl;}~Dog(){cout<<"Dog will die"<<endl;}};void main(){Dog dog;}3.#include<iostream>#include<math.h>using namespace std;#define PI 3.14class Point{public:Point(float x_=0, float y_=0):x(x_),y(y_){} protected:float x;float y;};class Rectangle:public Point{public:Rectangle(float x_, float y_):Point(x_,y_){}void Area();};void Rectangle::Area(){float area;area=x*y;cout<<"矩形的面积为: "<<area<<endl; }class Circle:public Point{public:Circle(float r_):Point(),r(r_){}void Area();private:float r;};void Circle::Area(){float area;area=PI*r*r;cout<<"圆的面积为: "<<area<<endl; }void main(){float l,w,r;cout<<"请输入长方形的长和宽: ";cin>>l>>w;cout<<"请输入圆的半径: ";cin>>r;Rectangle rectangle(l,w);rectangle.Area();Circle circle(r);circle.Area();}4.#include<iostream>using namespace std;#include<string>#define PI 3.14class circle{public:circle(float r_=0):r(r_){}void Area(){float area;area=PI*r*r;cout<<"圆的面积为: "<<area<<endl;}protected:float r;};class table{public:table(float h_, string color_):h(h_),color(color_){}void show(){cout<<"桌子的高度: "<<h<<'\n'<<"桌子颜色: "<<color<<'\n';}protected:float h;string color;};class roundtable:public circle,public table{public:roundtable(float r_, float h_, string color_):circle(r_),table(h_,color_) {cout<<"这是一个圆桌,它具体属性有: "<<endl;}};void main(){float r, h;string color;cout<<"请输入圆的半径: ";cin>>r;cout<<"请输入桌子的高度和颜色: ";cin>>h>>color;roundtable t(r,h,color);t.show();t.Area();}5.#include<iostream>using namespace std;#include<string>class student{private:string name, school;int no;public:student(string name_,int no_,string school_):name(name_),no(no_),school(school_){} student(){name="John";no=121003400;school="Shanghai University";}void print(){cout<<"大学生的信息如下: "<<endl;cout<<"姓名: "<<name<<endl;cout<<"学号: "<<no<<endl;cout<<"校名: "<<school<<endl;}};class graduate:public student{private:string direction,teacher;public:graduate(string name_,int no_,string school_,string direction_,string teacher_):student(name_,no_,school_),direction(direction_),teacher(teacher_){}void print(){cout<<"研究生的信息如下: "<<endl;cout<<"研究方向: "<<direction<<endl;cout<<"导师: "<<teacher<<endl;}};void main(){student s1;s1.print();student s2("Ranen", 121003411, "SDJU");s2.print();graduate s3("Cachy",121003422, "SDJU","Math","Tom");s3.student::print();s3.print();}。
继承与派生实验报告
用来记录对象的性别、age用来记录对象年龄、add用来记录对象的家庭住址;包括函数成
员printinfor()用来输出对象的个人信息。
要求:
(1)构造Worker类对象输出该对象的工号、年龄、家庭住址等信息。
b.PrintInfo();
return 0;
}
【实验结果与数据处理】
【实验结论】
(2)在Worker类的printinfor()成员函数中须调用Person类的成员函数PrintName()。
输出结果如:丁一10127男28合肥市长江路369号
分析:注意选择派生类对基类的继承方式。
【实验器材】
微型计算机、Visual C++ 6.0集成软件平台
【实验步骤】
1.编辑源程序。
2.对源程序进行编译并调试程序。
继承与派生实验报告
实验题目
继承与派生
日期
班级
组别
姓名
类型
【实验目的】
1.学会从现有类派生出新类的方式。
2.了解基类成员在派生类中的访问控制。
3.熟悉派生类中构造函数和析构函数的调用顺序。
4.掌握虚基类所要解决的问题。
【实验原理】
定义一个Person类,数据成员包含能够保存姓名的变量name,其中有能够输出姓名的成员函数PrintName()。
};Biblioteka class Worker:public Person
{
public:
Worker(char * n,int nu,char * s,int ag,char *add):Person(n)
湖北理工(黄石理工)C 实验 实验二派生类与继承
答:出现的错误如下:
原因是将基类 Base 中数据成员 x 的访问权限改为 private 后,X 在公有派生类中的访问属 性为不可被直接访问。
cout<<"error length"; exit(1); } alist=new int [leng]; length=leng; if(alist==NULL) { cout<<"assign failure"; exit(1); } cout<<"MyArray 类对象已创建。"<<endl; } MyArray::~MyArray() { delete[] alist; cout<<"MyArray 类对象被撤销。"<<endl; } void MyArray::Display(string str) { int i; int *p=alist; cout<<str<<length<<"个整数:"; for(i=0;i<length;i++,p++) cout<<*p<<" ";
cout<<endl; } void MyArray::Input() {
cout<<"请键盘输入"<<length<<"个整数:"; int i; int *p =alist; for(i=0;i<length;i++,p++) cin>>*p; } int main() { MyArray a(5); a.Input(); a.Display("显示已输入的"); return 0; } 实验运行结果:
继承与派生实验报告
b,float
int main() { teacher1 q(50); teacher2 w(70);
student2 e(75,82,100); student3 r(78,79,87); zhuyan t(80,70,78,81); system("pause"); return 0; } 内容2: #include <iostream> using namespace std; class employee {public: employee() {cout<<"编号:";cin>>number; cout<<"姓名:";cin>>name; salary=0;} protected: char number[5]; char name[10]; double salary; }; class manager:public employee {public: manager(){monthlypay=8000;salary=monthlypay;} void print() {cout<<"经理:"<<name<<"编号:"<<number<<"本月工资:" <<salary<<endl;} protected: int monthlypay; }; class technician:public employee {public: technician(){weekpay=100;} void pay() {cout<<name<<"工作时间:";
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
②将Bicycle继承Vehicle类的方式分别修改为protected和private,再重新编译,请在小结中记录报错信息,解释原因。记录采取何种修改方式使程序正确运行?
③将Bicycle类的继承方式恢复为public,代码回到①的状态,再在Bicycle类下面增加一个第二层汽车类Car的定义。主函数中定义该类对象,程序的运行结果是?
It's maxspeed is:2000000
It's weight is:50
It's height is:10
It's seatnum is:4
Destructing MotorCycle...
Destructing Car...
Destructing Vehicle...
Destructing Bycycle...
Show()中:cout<<"It\'s maxspeed is:"<<Bicycle::MaxSpeed<<endl;
cout<<"It\'s weight is:"<<Bicycle::Weight<<endl;
Main()中://mc.Run(); //mc.Stop();
程序运行结果:
Con structing Vehicle...
实验解答:
①按提示填写完整exp4_2.cpp程序代码对应位置内容是:
(1 )b1 (10);
(2 )d1 (20) ;
(3 )b1 = d1 ;
(4 )&b2 = d1 ;
(5 )* b3 = & d1 ;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________内容ng ______________________________________________________________________________________________________________________(6 )b3;
Please stop running!
It's maxspeed is:190
It's weight is:10
It's height is:1
Destructing Bycycle...
Destructing Vehicle...
Press any key to continue
从运行结果可以得到,定义派生类对象时构造函数与析构函数的调用方式及执行顺序是:
Constructing Bicycle...
The vehicle is running!
Please stop running!
It's weight is:10
It's height is:1
Constructing Vehicle...
Constructing Car...
The vehicle is running!
二、实验环境(实验设备)
硬件:微型计算机
软件: Microsoft Visual C++6.0
三、实验原理及内容
实验题目(1):定义一个车基类,派生出自行车类和汽车类,又以自行车类和汽车类为基类共同派生出摩托车类,每个类都要定义带有参数的构造函数。对自行车类继承车基类的方式分别用private、protected、public,观察基类成员在派生类中的访问属性;观察自行车类、汽车类和摩托车类对象定义时构造、析构函数的调用顺序。最后将车基类定义为虚基类再观察程序运行结果。
Destructing Vehicle...
Destructing Car...
Destructing Vehicle...
Destructing Bycycle...
Destructing Vehicle...
Press any key to continue
实验报告
实验题目(2):定义Base类及它的公有派生类Derived类,两个类中均定义带参数的构造函数,基类中定义函数Show( ),派生类中也定义一个同名的Show( ),二者输出内容有所区别。主函数中定义基类的对象、指针、引用,也定义派生类的对象。
Please stop running!
It's maxspeed is:200000
It's weight is:5000
It's seatnum is:4
Constructing Vehycle...
Constructing Vehicle...
Constructing Car...
{
MaxSpeed=m;
Weight=w;
cout<<"Constructing Vehicle...\n";
}
~Vehicle()
{
cout<<"Destructing Vehicle...\n";
}
void Run()
{
cout<<"The vehicle is running!\n";
}
void Stop()
Constructing MotorCycle...
It's maxspeed is:2000000
It's weight is:50
It's height is:10
It's seatnum is:4
Destructing MotorCycle...
Destructing Car...
Destructing Vehicle...
实验解答:
1根据提示进行填写完整exp4_1.cpp代码对应位置内容如下:
#include <iostream>
using namespace std;
class Vehicle
{
protected:
int MaxSpeed;
int Weight;
public:
Vehicle(int m,int w)
Destructing Bycycle...
Destructing Vehicle...
Destructing Car...
Destructing Vehicle...
Destructing Bycycle...
Destructing Vehicle...
Press any key to continue
MotorCycle(int m,int w,int h,int s):Bicycle(m,w,h),Car(m,w,s),Vehicle(m,w)
结果:Constructing Vehicle...
Constructing Bicycle...
The vehicle is running!
Please stop running!
}
void Show()
{
Vehicle::Show();
cout<<"It\'s height is:"<<Height<<endl;
}
};
实验报告
此时程序的运行结果是:
Constructing Vehicle...
Constructing Bicycle...
The vehicle is running!
void Show(){Vehicle::Show();
cout<<"It\'s seatnum is:"<<SeatNum<<endl;}
};
主函数中添加
Void main()
{
Car c(200000,5000,4);
c.Run();
c.Stop();
c.Show();
}
实验报告
④在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有方式继承了第二层的Bicycle和Car类。定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show( ),输出所有四个成员变量的信息。主函数中只定义类MotorCycle的对象并调用相应的函数,程序进行编译,会有4 error(s)和8 warning(s),为消除二义性,你在哪几条语句处作了怎样的修改直到程序正确?程序的运行结果是?分析程序运行结果中各个类构造函数与析构函数的调用顺序,你的结论是?
基类指针b3 = &d1 , b3 -> show(): i in Base is : 20
基类指针b4 = d4 , b4 -> show():i in Base is : 20
派生类指针d4 , d4 -> show():i in Derived : 20
在主函数的return 0;语句前增加4条语句:
It's weight is:5000
It's seatnum is:4
Constructing Vehicle...
Constructing Bicycle...