c++类的继承与派生 实验报告
实验五 继承与派生2(报告)
验
内
容
创建一个表示雇员信息的employee类,其中包含数据成员name、empNo和salary,分别表示雇员的姓名、编号和月薪。再从employee类派生出3个类worker、technician和salesman,分别代表普通工人、科研人员、销售人员。三个类中分别包含数据成员productNum、workHours和monthlysales,分别代表工人每月生产产品的数量、科研人员每月工作的时数和销售人员每月的销售额。
2、派生类的定义(worker普通工人类、technician科研人员类和salesman销售人员类)
worker普通工人类的定义,公有继承employee,增加变量productNum(产品数量)与profit(每件产品的利润)及用来计算雇员月薪pay()函数(计算员工月工资并输出)。
technician科研人员类公有继承employee,增加变量workHours(工作时间)及hoursalary(每小时的工资)及pay()函数(功能同上)。
salesman销售人员类也是公有继承employee,增加monthlysales(月销售额)、ti_cheng(销售额提成)及pay()函数(功能同上)。
如上图主函数。定义三个不同工种的员工,并输出信息。
实
验
结
果
运行结果:
出
现
的
问
题
及
解
决
方
案
程序编译一次成功了,这次没有意外。
课程名称
C++程序设计A2
班级
1420561
实验日期
2015.01.01
姓名
刘翔翔
学号
21
实验成绩
c 继承与派生实验报告
c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
c++继承与派生实验报告
第七章继承与派生实验目的学习声明和使用类的继承关系,声明派生类熟悉不同继承方式下对基类的访问控制学习使用虚基类解决二义性问题实验内容7.1#include <iostream>using namespace std;class animal{public:private:int age;};class dog:public animal{public:void setage(int n);private:};void dog::setage(int n){age=n;}int main(){dog d1;d1.setage(5);return 0;}无法访问age,因为公有继承的继承规则是基类的私有类不可访问、#include <iostream>using namespace std;class animal{public:int age;private:};class dog:public animal{public:void setage(int n);private:};void dog::setage(int n){age=n;}int main(){dog d1;d1.setage(5);return 0;}把age移到private里即可7.2#include <iostream>using namespace std;class baseclass{public:baseclass(int n){number=n;cout<<"调用了基类的构造函数"<<endl;}~baseclass(){cout<<"调用了基类的析构函数"<<endl;}private:int number;};class derivedclass:public baseclass{public:derivedclass(int n):baseclass(n){cout<<"调用了派生类的构造函数"<<endl;}~derivedclass(){cout<<"调用了派生类的析构函数"<<endl;}private:};int main(){derivedclass d(3);return 0;}7.3#include <iostream>using namespace std;class vehicle{public:void run();void stop();vehicle(int m,int w){maxspeed=m;weight=w;}private:int maxspeed;int weight;};void vehicle::run(){cout<<"it is running"<<endl;}void vehicle::stop(){cout<<"stop"<<endl;}class bicycle:public vehicle{public:bicycle(int m,int w,int h):vehicle(m,w){height=h;}private:int height;};class motorcar:public vehicle{public:motorcar(int m, int w, int s):vehicle(m,w){seatnum=s;}private:int seatnum;};class motorcycle:public bicycle,public motorcar{public:motorcycle(int m,int w,int h,int s):vehicle(m,w),bicycle(m,w,h),motorcar(m,w,s) {}};int main(){motorcycle cat(1,2,3,4);cat.run();cat.stop();return 0;}不设虚基类报错指代不明是哪一层函数#include <iostream>using namespace std;class vehicle{public:void run();void stop();vehicle(int m,int w){maxspeed=m;weight=w;}private:int maxspeed;int weight;};void vehicle::run(){cout<<"it is running"<<endl;}void vehicle::stop(){cout<<"stop"<<endl;}class bicycle:virtual public vehicle{public:bicycle(int m,int w,int h):vehicle(m,w){height=h;}private:int height;};class motorcar:virtual public vehicle{public:motorcar(int m, int w, int s):vehicle(m,w){seatnum=s;}private:int seatnum;};class motorcycle:public bicycle,public motorcar{public:motorcycle(int m,int w,int h,int s):vehicle(m,w),bicycle(m,w,h),motorcar(m,w,s) {}};int main(){motorcycle cat(1,2,3,4);cat.run();cat.stop();return 0;}。
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来创建具体的按钮和文本框。
这样,我们可以通过继承和派生的方式,实现不同的界面元素,并且可以在派生类中添加新的功能,如按钮的点击事件和文本框的输入验证。
继承与派生的注意事项:在使用继承与派生的过程中,我们需要注意一些问题。
首先,派生类可以访问基类的公有成员,但不能访问基类的私有成员。
继承与派生实验报告
西安财经学院信息学院《面向对象方法及程序设计》 实验报告实验名称 继承与派生 实验室 519 实验日期 12.23继承与派生一、实验目的与要求1. 进一步巩固C++语言中类和对象的概念和应用。
2. 掌握继承和派生的概念和实现。
3. 进一步熟练掌握类和对象的概念,使用的方法,访问的规则。
4. 掌握单继承的概念和应用。
5. 掌握多继承和虚基类的概念,并熟练应用。
二、实验内容1.根据如图所示编辑程序,计算教师的课时,计算学生的平均成绩,假定每个学生3门课程,并输出每个类的信息(例如教师的职称,学生的专业等,程序实现要求使用到虚基类的知识)。
2. 编写一个程序实现员工的工资管理。
该公司主要有4类人员,经理(manager ),销售经理(salesmanager),技术人员(technician),销售员(salesman)。
这些人员都是职员(employee ),有编号,姓名,月工资,工龄等信息。
月工资的计算方法为:经理固定月薪8000元,技术人员每小时工资100元,销售人员底薪为1000,然后加上每月的销售额的4%,销售经理底薪5000,然后加上本部门当月销售总额的千分之五。
要求编写程序计算该公司职员的月工资并输出到屏幕上。
(假定该公司1个经理,1个销售经理,3个技术人员,3个销售人员)三、实验环境 硬件环境:PC 一台姓名 学号 班级 年级 指导教师 李翠软件环境:WIN7操作系统、Microsoft visual c++ 2010 四、实验步骤五、实验结果六、小结通过本次实验,使我对继承与派生有了更深入的了解。
包括,虚基类以及虚基类与派生类的构造函数与析构函数的调用等等。
七、源程序清单内容1:#include"iostream"using namespace std;class person{};class teacher:virtual public person{public:int b;};class teacher1:virtual public teacher{public:teacher1(int B){b=B;cout<<"教授"<<endl;cout<<"课时:"<<b<<endl;}};class teacher2:virtual public teacher{public:teacher2(int D){b=D;cout<<"讲师"<<endl;cout<<"课时:"<<b<<endl;}};class teacher3:virtual public teacher{public:teacher3(int F){b=F;cout<<"研究生助教"<<endl;cout<<"课时:"<<b<<endl;}};class student:public person{public:float a1,a2,a3;};class student1:public student{public:student1(float b1,float b2,float b3){a1=b1;a2=b2;a3=b3;cout<<"英语:"<<a1<<endl;cout<<"数据库:"<<a2<<endl;cout<<"java:"<<a3<<endl;}};class student2:public student{public:student2(float b1,float b2,float b3){a1=b1;a2=b2;a3=b3;cout<<"本科生:"<<endl;cout<<"英语:"<<a1<<endl;cout<<"组成原理:"<<a2<<endl;cout<<"c++:"<<a3<<endl;}};class student3:public student{public:student3(float b1,float b2,float b3){a1=b1;a2=b2;a3=b3;cout<<"专科生:"<<endl;cout<<"英语:"<<a1<<endl;cout<<"c语言:"<<a2<<endl;cout<<"数字电路:"<<a3<<endl;}};class zhuyan:public teacher3,public student1{public:zhuyan(int x,float a,float b,float c):teacher3(x),student1(a,b,c) {}};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<<"工作时间:";cin>>workhour;salary=workhour*100;}void print(){cout<<"技术人员:"<<name<<"编号:"<<number<<"本月工资:"<<salary<<endl;} protected:int weekpay;int workhour;};class salesman:public employee{public:salesman(){basicsalary=1000;commrate=0.04;}void pay(){cout<<name<<"本月销售额:";cin>>sales;salary=basicsalary+sales* commrate;}void print(){cout<<"销售员:"<<name<<"编号:"<<number<<"本月工资:"<<salary<<endl;} protected:int basicsalary;double commrate;double sales;};class salesmanager:public salesman{public:salesmanager(){monthlypay=5000;commrate=0.005;}void pay(){cout<<name<<"本月部门销售额:";cin>>sales;salary=monthlypay+sales* commrate;}void print(){cout<<"销售经理:"<<name<<"编号:"<<number<<"本月工资:"<<salary<<endl;} private:double monthlypay;};int main(){manager obj1;obj1.print();technician obj2,obj3,obj4;obj2.pay(); obj2.print();obj3.pay(); obj3.print();obj4.pay(); obj4.print();salesman obj5,obj6,obj7;obj5.pay(); obj5.print();obj6.pay(); obj6.print();obj7.pay(); obj7.print();salesmanager obj8;obj8.pay(); obj8.print();system("pause"); }。
c++继承与派生实验报告
第四次试验报告班级:计算机1204姓名:杨天野学号:20123914 题目一(1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age 改为公有成员变量,还回有问题吗?编程试之。
源程序:#include<iostream>using namespace std;class Animal{private:int age;};class dog:public Animal{public:SetAge(int n);};dog::SetAge (int n){age = n;}int main(){dog d1;d1.SetAge (90);return 0;}截屏:错误:‘age’ : cannot access private member declared in class ‘Animal’改为公有变量时:源程序:#include<iostream>using namespace std;class Animal{public:int age;};class dog:public Animal{public:SetAge(int n);};dog::SetAge (int n){age = n;}int main(){dog d1;d1.SetAge (90);return 0;}截图:题目二:(2)定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
源程序:#include<iostream>using namespace std;class baseclass{public:baseclass(){cout<<"构造了基类的一个构造函数"<<endl;}~baseclass(){cout<<"构造了基类的一个析构函数"<<endl;}private:int Number;};class DerivedClass:public baseclass{public:DerivedClass(){cout<<"构造了一个派生类的构造函数"<<endl;} ~DerivedClass(){ cout<<"构造了一个派生类的析构函数"<<endl; }};int main(){DerivedClass n;return 0;}截图:题目三:(3)定义一个车(vehicle)基类,具有Maxspeed、Weight等成员,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
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.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。
#include <iostream.h>class A{public:void seta(int i){ a=i; }int geta(){ return a; }public:int a;};class B:public A{public:void setb(int i){ b=i; }int getb(){ return b; }void show(){ cout<<"A::a="<<a<<endl; } //语句9 public:int b;};void main(){B bb; //语句1bb.seta(6); //语句2bb.setb(3); //语句3bb.show(); //语句4cout<<"A::a="<<bb.a<<endl; //语句5cout<<"B::b="<<bb.b<<endl; //语句6cout<<"A::a="<<bb.geta()<<endl; / /语句7cout<<"B::b="<<bb.getb()<<endl; //语句8 }按下列要求对程序进行修改,然后调试,对出现的错误分析其原因。
(1)将派生类B的继承方式改为private时,会出现哪些错误和不正常现象?为什么?(2)将派生类B的继承方式改为protected时,会出现哪些错误和不正常现象?为什么?(3)将派生类B的继承方式恢复为public后,再将类A中数据成员a的访问权限改为private时,会出现哪些错误和不正常现象?为什么?(4)派生类B的继承方式仍为public,将类A中数据成员a的访问权限改为protected时,会出现哪些错误和不正常现象?为什么?2.定义一个基类MyArray,基类中可以存放一组整数。
派生类与继承(1)(C++实验报告八)-17春
实验八派生类与继承(1)班级软件一班学号16044115 姓名李泽一、实验目的:学习派生类的定义方法。
二、实验要求:1.理解继承的概念。
2.掌握派生类的声明方法和派生类构造函数的定义方法。
3.学会使用类的组合。
三、实验内容与程序代码:1.编写一个程序,通过继承来计算圆、球、圆柱体和圆锥的表面积和体积。
要求:(1)定义一个圆类,包含半径成员。
(2)分别定义球类、圆柱体类和圆锥类作为圆类的派生类。
(3)计算并输出圆、球、圆柱体和圆锥的表面积和体积。
输入输出参考样式如下:程序源代码:#include<iostream>#include<math.h>using namespace std;class A{public:void set1(int a){r=a;}void show1(){cout<<"请输入圆的半径:"<<r<<endl;cout<<"圆的面积:"<<3.14*r*r<<endl;}protected:int r;};class B:public A{public:void set2(int a){set1(a);}void show2(){cout<<"请输入球的半径:"<<r<<endl;cout<<"球的表面积:"<<4*3.14*r*r<<endl;cout<<"球的体积:"<<4/3*3.14*r*r*r<<endl;}class C{public:void set3(int a,int b){r=a;h=b;}void show3(){cout<<"圆柱体的半径和高为:"<<r<<" "<<h<<endl;cout<<"圆柱体的表面积:"<<2*3.14*r*r+2*3.14*r*h<<endl;cout<<"圆柱体的体积:"<<3.14*r*r*h<<endl;}protected:int r;int h;};class D:public C{public:void set4(int a,int b){set3(a,b);}void show4(){cout<<"圆锥的半径和高:"<<r<<" "<<h<<endl;cout<<"圆锥的表面积:"<<3.14*r*r+3.14*r*sqrt(h*h+r*r)<<endl;cout<<"圆锥的体积:"<<3.14*r*r*h/3<<endl;};int main(){B op;op.set1(1);op.show1();cout<<endl;op.show2();cout<<endl;D op1;op1.set3(1,1);op1.show3();cout<<endl;op1.show4();return 0;}运行结果:2.程序填空。
c++类的继承与派生--实验报告
cout<<"输出第"<<i+1<<"位教师的信息:\n";
teac[i].display2();
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}
cout<<"请问你是否继续重新返回操作?(y/n)\n";
cin>>d;
if(d=='n'||d=='N')break;
char a,d;
int b;
int c;
student stud[max];
teacher teac[max];
while(1)
{
cout<<"请问你是否需要输入学生信息?(y/n)\n";
cin>>a;
if(a=='y'||a=='Y')
{
cout<<"请问你要输入几个学生的信息(n不大于1000人)";
cin>>b;
for(int i=0;i<b;i++)
{
cout<<"请输入第"<<i+1<<"的信息\n";
stud[t<<"请问你是否需要输入教师信息?(y/n)\n";
cin>>a;
if(a=='y'||a=='Y')
{
cout<<"请问你要输入几个(n)教师的信息(n不大于1000人)";
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<iostream>using namespace std;class Base1{public:Base1(){cout<<"constructing Base1"<<endl;}~Base1(){cout<<"destructing Base1"<<endl;}};class Base2{public:Base2(){cout<<"constructing Base2"<<endl;}~Base2(){cout<<"destructing Base2"<<endl;}};class Derived1:public Base1,virtual public Base2{public:Derived1(){cout<<"constructing Derived1"<<endl;}~Derived1(){cout<<"destructing Derived1"<<endl;}};class Derived2:public Base1,virtual public Base2{public:Derived2(){cout<<"constructing Derived2"<<endl;}~Derived2(){cout<<"destructing Derived2"<<endl;}};class Derived3:public Derived1,virtual public Derived2 {public:Derived3(){cout<<"constructing Derived3"<<endl;}~Derived3(){cout<<"destructing Derived3"<<endl;}};int main(){Derived3 obj;return 0;}(2)4代码如下#include<iostream>using namespace std;const double PI=3.14;class Shape{public:double area()const{return 0.0;}void display(){};};class TwoDimShape:virtual public Shape{};class ThreeDimShape:virtual public Shape{};class Circle:public TwoDimShape{public:Circle(double myr){R=myr;}double area()const{return PI*R*R;}void display(){cout<<"Area of circle is ";}private:double R;};class Rectangle:public TwoDimShape{public:Rectangle(double myl,double myw){L=myl;W=myw;}double area()const{return L*W;}void display(){cout<<"Area of rectangle is";}。
实验四 C++中的继承与派生
实验四C++中的继承与派生一、实验目的:1.理解C++中继承与派生的概念;2.掌握C++中各种不同继承方式的访问属性差别;3.掌握单继承与多继承的实现方法;4.掌握派生类构造函数与析构函数的实现及调用顺序;5.掌握虚基类的使用方法。
二、实验任务【题目】小型公司人员管理某小型公司有四类人员:经理、技术人员、销售经理、销售员。
设计一个基类employee,派生出manager(经理)、technician(技术人员)、salesmanager(销售经理)、saleman(销售员)。
销售经理既是经理又是销售员,兼具两类人员的特点,因此同时继承manager 和salesman 两个类。
1、类定义1)employee 类:基本信息:编号、姓名、性别、出生日期、职位、薪水等;出生日期使用自定义的Date (日期)类;2)Date 类:成员变量:年、月、日3)派生类technician:新增属性:工作时间派生类saleman:新增属性:销售额、所属部门2、实现人员信息的录入与显示;3、计算并显示个人月薪:月薪计算办法:总经理拿固定月薪8000 元,技术人员按每小时25 元领取月薪;推销员的月薪按当月销售额的4%提成;销售经理固定月薪5000 元加所管辖部门当月销售总额的5‰。
【提示】1、在基类中,除了定义构造函数和析构函数,还应统一定义对各类人员信息应有的操作,规范类族中各派生类的基本行为,但是各类人员的月薪计算方法不同,不能在基类employee 中统一确定计算方法。
各类人员信息的显示内容不同,同样不能在基类employee中统一确定显示方法。
在基类中实现上述功能的函数体应为空,在派生类中根据同名覆盖原则定义各自的同名函数实现具体功能。
代码:#include<iostream>#include<string>using namespace std;class Date{private:int year;int month;int day;public:void SetYear(int x) {year=x;}void SetMonth(int x) {month=x;}void SetDay(int x) {day=x;}int GetYear() {return year;}int GetMonth() {return month;}int GetDay() {return day;}};class employee{protected:int num;string nam;string sex;Date birth;string position ;float salary;public:void display(){cout<<"编号:"<<num<<"姓名:"<<nam<<"性别:"<<sex<<"出生日期:"<<birth. GetYear()<<"-"<<birth.GetMonth()<<"-"<<birth.GetDay()<<"职位:"<<position;}};class manager:virtual public employee{public:void set_manager(int n,string na,string se,int y,int m,int d,string pos){num=n;nam=na;sex=se;birth.SetYear(y);birth.SetMonth(m);birth.SetDay(d);position=pos;}void display(){employee::display();}void total_salary(){ salary=8000;cout<<"经理月薪:";cout<< salary<<"元";}};class technician:virtual public employee{protected:float Time;public:float t;void set_technician(int n,string na,string se,int y,int m,int d,string pos,float t) { num=n;nam=na;sex=se;birth.SetYear(y);birth.SetMonth(m);birth.SetDay(d);position=pos;Time=t;}void display(){ employee::display();cout<<"工作时间:"<<Time<<endl;}void total_salary(){salary= 25*Time;cout<<"技术人员月薪:" ;cout<< salary<<"元";}};class saleman :virtual public employee{protected:float sale;string dep;public:void set_saleman(int n,string na,string se,int y,int m,int d,string pos,float sale1,string de) {num=n;nam=na;sex=se;birth.SetYear(y);birth.SetMonth(m);birth.SetDay(d);position=pos;sale=sale1;dep=de;}void display(){employee::display();cout<<position<<"销售额:"<<sale<<"所属部门:"<<dep<<endl;}void total_salary (){salary=sale*0.04;cout<<"销售员月薪:"<<salary<<"元";}};class salesmanager:public manager,public saleman{public:void total_salary (){salary=sale*0.05+5000;cout<<"销售经理月薪:" << salary<<"元";}};int main (){manager m1;technician tec;saleman s;salesmanager sg;int n,y,m,d,choose,choose1;string str,se, p;cout<<"\n\t\t================================================="<<endl;cout<<"\t\t1:输入信息与显示2:个人月薪0:退出"<<endl;cout<<"\t\t=================================================="<<endl;cout<<"\n输入您要进行的操作:";cin>>choose;while(choose!=0){switch(choose){case 1:cout<<"输入员工编号:";cin>>n;cout<<"输入员工出生日期:";cin>>y>>m>>d;cout<<"输入员工姓名:";cin>>str;cout<<"输入员工性别:";cin>>se;cout<<"输入员工职位:";cin>>p;if (p=="manager"){m1.set_manager( n, str, se,y,m,d,p);m1.display();}else if(p=="technician"){float t;cout<<"输入时间:";cin>>t;tec.set_technician( n,str, se,y,m,d, p, t) ;tec.display();}else if(p=="saleman"){float sale2;string de;cout<<"销售额:" ;cin >> sale2;cout<<"所属部门:";cin>>de ;s.set_saleman( n, str, se,y,m,d, p, sale2, de);s.display();}else{float sale1;string de;cout<<"销售额:" ;cin>>sale1;cout<<"所属部门:";cin>>de ;sg.set_saleman( n,str, se,y,m,d, p, sale1, de) ;s.display();}break;case 2:cout<<"\n\t\t===================================================="<<endl;cout<<"\t\t11: 经理12: 技术人员13:销售员14:销售经理"<<endl;cout<<"\t\t============================================================"< <endl;cout<<"\n输入您要进行的操作:";cin>>choose1;while(choose1!=0){ switch(choose1){case 11:m1.total_salary();break;case 12:tec.total_salary();break;case 13:s.total_salary();break;case 14:sg.total_salary();break;}choose1=0;}break;}cout<<"\n\t\t=================================================="<<endl;cout<<"\t\t1:输入信息与显示2:个人月薪0:退出"<<endl;cout<<"\t\t=================================================="<<endl;cout<<"\n输入您要进行的操作:";cin>>choose;}return 0;}。
C++实验三 派生类与继承
实验三派生类与继承班级:123班姓名:朱广金学号:122536一、实验目的1、学习类的继承,能够定义和使用类的继承关系。
2、学习派生类的声明与定义方法。
3、掌握类的定义和对象的声明。
4、熟悉公有派生和私有派生的访问特性。
5、掌握派生类构造函数和析构函数的执行顺序。
6、掌握利用访问声明调整基类成员在派生类中的访问属性。
*****************************************************//**************************************************************************二、试验内容1、下面的程序可以输出ASCII字符与所对应的数字的对照表。
修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。
***************************************************************************#include<iostream>/****************iomanip的作用:*主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。
它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:*dec 置基数为10 相当于"%d"*hex 置基数为16 相当于"%X"*oct 置基数为8 相当于"%o"*setfill( 'c' ) 设填充字符为c*setprecision( n ) 设显示有效数字为n位*setw( n ) 设域宽为n个字符*这个控制符的意思是保证输出宽度为n。
************************************#include <iomanip>using namespace std;//基类class table{public://构造函数table(char p,char q){i=p;j=q;}void ascii(void);protected:char i;char j;};///////////////////////////////////////////////////////void table::ascii(void){int k=1;for (;i<=j;i++){cout<<setw(4)<<i<<(int)i;if((k)%12==0) //每12个换行cout<<"\n";k++;}cout<<"\n";}//派生类class der_table:public table{public:der_table(char p,char q,char *m):table(p,q)//派生类的构造函数{c=m;}void print(void);protected:char *c;};//////////////////////////////////////////////////////////void der_table::print(void){cout<<c<<"\n";table::ascii();}//主函数int main(){der_table obl('a','z',"ASCII value---char");obl.print();return 0;/*****************************************提示:修改后的主程序为:int main(){der_table ob('a','z',"ASCII value---char");ob.print();return 0;}*******************************************//*********************************************************************2、已有类Time和Date,要求设计一个派生类Birthtime,*它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,*同事设计主程序显示一个小孩的出生时间和名字。
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;}上述代码示例了如何使用派生类创建对象,并访问基类的属性和派生类自己的属性。
[C++]继承和派生实验报告
运行结果:修改过后的程序代码如下:#include <iostream>#include <cstring>using namespace std;class Person{private: char m_strName[20];int m_nAge;int m_nSex;public: Person();//构造函数Person( char *name, int age, char sex ); //构造函数Person( const Person &p ); //拷贝构造函数~Person() //析构函数{cout<<"Now destroying the instance of Person"<<endl;}void SetName( char *name );void SetAge( int age );void setSex( char sex );char* GetName();运行结果:2. 程序的类结构图为:A-x:int+A()+A( int m ) : x( m )+~A()B-A a-y:int+B()+B( int m, int n, int l ) : A( m ), a( n ),y( l )+~B()运行结果:3.程序的类结构图为:Person#m_name[20]:char#m_age:int#m_sex:char+Person()+information(char* name,int age,char sex):void+~Person()Teacher#major[20]: char#position[20]: char#course[20]: char+m_major(char* m): void+m_position(char* p):void+m_course(char* c): voidcout<<'['<<x_size<<","<<y_size<<']'<<", "<<'['<<i_size<<","<<j_size<<']'; }int main(){Circle1 circle(0.0,0.0,3.0);circle.area();circle.perimeter();circle.print();cout<<"\n";Square1 square(0.0,0.0,3.0,3.0);square.area();square.perimeter();square.print();cout<<"\n";cout<<"圆的面积为:"<<circle.area()<<endl;cout<<"圆的周长为:"<<circle.perimeter()<<endl;cout<<"圆的圆心坐标和半径为:";circle.print();cout<<"\n\n";cout<<"正方形的面积为:"<<square.area()<<endl;cout<<"正方形的周长为:"<<square.perimeter()<<endl;cout<<"正方形的中心坐标和一个顶点坐标分别为:";square.print();cout<<"\n";return 0;}运行结果:。
C++实验报告--继承和派生
}
void show(){
Person::show();
cout<<"Teacher lesson:"<<lesson<<endl;
}
};
class Student:virtual public Person{
private:
{
cout<<"constructing...."<<endl;
}
void show(){
cout<<"YJSZJ:"<<endl;
Teacher::show();
Student::show();
}
};
void main(){
YJSZJ x(21,50,98.0,99.0,97.0,5000,02);
}
void show_biaomianji()
{
cout<<"表面积:"<< "2*(A*B+A*H+B*H)= "<<2*(A*B+A*H+B*H)<<" (cm2)"<<endl;;
}
};
void main(){
Point C(6,8),D(3,4);
C.showXY();
D.showXY();
int H;
public:
Cuboid(int H,int A,int B,int X,int Y):Rectangle(A,B,X,Y)
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,我们可以看到其对程序运行结果的影响。
这种灵活性,使得我们可以根据具体需求,定制不同的派生类,实现更加个性化的功能。
派生类与继承实验报告
void show1()
{coutvv" nu m:"v vnum vve ndl;
coutv v"n ame:"v vn amevve ndl; coutvv"sex:"vvsexvve ndl;
coutvv"age:"vvagevve ndl;
coutvv"a part:"vva partvve ndl;
2将基类Base中数据成员x的访问权限改为protected什么?
3在源程序的基础上,将派生类Derived的继承方式改为 错误?为什么?
4在源程序的基础上,将派生类Derived的继承方式改为 些错误?为什么?
时,会出现哪些错误?为
private时,会出现哪些
P rotected时,会出现哪
解答如下;
}
~Teacher()tri ng title;
};
int main()
{Stude nt S(1001,"ya ng-he ng",f,21,"com pu ter",98);
Teacher T(2009,"li-she ng",f,35,"ma nager","educatio n");
c:\docuiipiits and settings\adninistrator\Lcpp[29):error促测:* :cdirnot access public nember declaredinclass ' Base*c:ld(Miwnts andsettings\ jdninisttQr\t.cpp(1fl):5ee tiHlmration肝霍‘
湖北理工(黄石理工)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; } 实验运行结果:
C++程序设计实验 类的继承和派生
《C++程序设计》实验报告准考证号xxxxxx题目:类的继承和派生姓名xxx 日期xxx实验环境:Visual c++6.0实验内容与完成情况实验目的:1,理解继承派生的概念2,掌握派生类的定义,熟练定义派生类及其构造函数、析构函数3,理解继承派生中可能存在的问题实验内容:1,完成基类的定义定义person类,其属性有姓名name、年龄age、性别sex定义相关构造函数、析构函数,提供不同的构造函数以不同方式构造对象定义showperson函数显示相关信息定义setperson函数存入相关信息2,定义派生类student其属性增加:学号ID、年级grade、班级clas定义相关构造函数、析构函数,提供不同的构造函数以不同方式构造对象定义showstudent函数显示对象的所有信息定义setstudent函数存入相关信息3,定义派生类teacher其属性增加:工号ID、职务position、部门department定义相关构造函数、析构函数,提供不同的构造函数以不同方式构造对象定义showteacher函数显示对象的所有信息定义setteacher函数存入相关信息4,设计main函数创建对象,测试派生类对象产生时,构造函数调用过程派生类对象释放时,析构函数调用过程并输出结果源程序代码:#include<iostream>#include<string>using namespace std;class person{protected:string name,sex;int age;public:person(string a="未命名",int b=0,string c="未知"){name=a;age=b;sex=c;}void setperson(string a,int b,string c);void showperson();~person(){cout<<"析构"<<name<<endl;}};void person::setperson(string a,int b,string c){name=a;age=b;sex=c;}void person::showperson(){cout<<"姓名:"<<name<<"\t年龄:"<<age<<"\t性别:"<<sex<<endl;}class student:public person{string ID,grade,clas;public:student(string a="未命名",int b=0,string c="未知",string d="0000",string e="未知",string f="未知"):person(a,b,c){ID=d;grade=e;clas=f;}void showstudent();void setstudent(string a,int b,string c,string d,string e,string f);~student(){cout<<"析构"<<name<<endl;}};void student::showstudent(){person::showperson();cout<<"学号:"<<ID<<"\t年级:"<<grade<<"\t班级:"<<clas<<endl;}void student::setstudent(string a,int b,string c,string d,string e,string f){setperson(a,b,c);ID=d;grade=e;clas=f;}class teacher:public person{string ID,position,department;public:teacher(string a="未命名",int b=0,string c="未知",string d="无",string e="未知",string f="未知"):person(a,b,c){ID=d;position=e;department=f;}void showteacher();void setteacher(string a,int b,string c,string d,string e,string f);~teacher(){cout<<"析构"<<name<<endl;}};void teacher::showteacher(){person::showperson();cout<<"工号:"<<ID<<"\t职务:"<<position<<"\t部门:"<<department<<endl;}void teacher::setteacher(string a,int b,string c,string d,string e,string f){setperson(a,b,c);ID=d;position=e;department=f;}void main(){person a1("张三",15,"男");a1.showperson();person a2("小三");a2.showperson();person b;string h,j;int i;cout<<"请输入:"<<endl;cout<<"姓名:";cin>>h;cout<<"年龄:";cin>>i;cout<<"性别:";cin>>j;b.setperson(h,i,j);b.showperson();student c1("王五",16,"男","1001","10级","二班");c1.showstudent();student c2("小五",16,"男");c2.showstudent();student d;string k,l,m;cout<<"请输入:"<<endl;cout<<"姓名:";cin>>h;cout<<"年龄:";cin>>i;cout<<"性别:";cin>>j;cout<<"学号:";cin>>k;cout<<"年级:";cin>>l;cout<<"班级:";cin>>m;d.setstudent(h,i,j,k,l,m);d.showstudent();teacher e1("赵六",33,"男","2002","教授","计算机学院");e1.showteacher();teacher e2("小刘",33,"男");e2.showteacher();teacher f;string n,o,p;cout<<"请输入:"<<endl;cout<<"姓名:";cin>>h;cout<<"年龄:";cin>>i;cout<<"性别:";cin>>j;cout<<"工号:";cin>>n;cout<<"职务:";cin>>o;cout<<"部门:";cin>>p;f.setteacher(h,i,j,n,o,p);f.showteacher();}输出结果:出现的问题:解决方案(列出遇到的问题和解决办法,列出没有解决的问题)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main()
{
globe gl(2); //球
gl.display();
cylinder cy(2,3); //圆柱体
cy.display1();
cone co(2,3); //圆锥体
co.display2();
return 0;
}
(源程序清单等)
要求:
(1)定义一个基类圆,至少含有一个数据成员:半径;
(2)定义基类的派生类:球、圆柱、圆锥,都含有求表面积和体积的成员函数和输出函数。
(3)定义主函数,求球、圆柱、圆锥的和体积。
算
法
描
述
及
实
验
步
骤
1首先定义一个基类person
2派生类student和teacher
3实现客户信息的手动输入
4实现客户输出信息的需求
{
radius=r;
}
void area();
void volume();
void display();
};
class cylinder:public circle
{
private:
double height;
public:
cylinder(double r,double h):circle(r)
{
volume1();
}
void cone::area2()
{
cout<<"则圆锥体的面积:"<<pi*radius*sqrt(radius*radius+height*height)<<endl;//利用sqat函数
}
void cone::volume2()
{
cout<<"则圆锥体的体积:"<<(pi*radius*radius*height)/3;
}
void area2();
void volume2();
void display2();
};
实验二: circle1.cpp
#define pi 3.1415926 //定义π
#include "circle1.h"
#include<cmath>
#include<iostream>
using namespace std;
5实现客户的循环利用
6首先定义一个基类circle
7派生类cylinder和cone
8构造函数及调用有关函数
9定义求体积及面积的函数
调
试
过
程
及
实
验
结
果
调试过程中出现较少的语法错误,主要是链接以及友元的使用不熟练等
实验一的调试结果:学生及教师的信息输入:
学生及教师信息的输出:(有清屏的实现)
实验二的调试结果:
{
cout<<"输出第"<<i+1<<"位教师的信息:\n";
teac[i].display2();
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}
cout<<"请问你是否继续重新返回操作?(y/n)\n";
cin>>d;
if(d=='n'||d=='N')break;
}
void globe::display()
{
cout<<"球的半径:"<<radius<<endl;
area();
volume();
}
void cylinder::area1()
{
cout<<"则圆柱的面积:"<<2*pi*radius*radius+2*pi*radius*height<<endl;
}
void cone::display2()
{
cout<<"圆锥体的半径:"<<radius<<" ;圆锥体的高:"<<height<<endl;
area2();
volume2();
cout<<endl;
}
实验二: circle.cpp
#include "circle1.h"
#include<iostream>
}
void cylinder::volume1()
{
cout<<"则圆柱的体积:"<<pi*radius*radius*height<<endl;
}
void cylinder::display1()
{
cout<<"圆柱的半径:"<<radius<<" ;圆柱的高:"<<height<<endl;
area1();
cin>>c;
for(int i=0;i<c;i++)
{
cout<<"请输入第"<<i+1<<"教师的信息:\n";
teac[i].set2();
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}
}
system("cls");
cout<<"请问你是否查看全部信息?(y/n)\n";
12)注意头文件的关联;
13)注意循环的使用
(对实验结果进行分析,实验心得体会及改进意见)
附
录
附
录
附
录
附
录
实验的源程序:
实验一: person1.h
class person
{
private:
char number[20];
char name[20];
public:
void set();
void display();
height=h;
}
void area1();
void volume1();
void display1();
};
class cone:public circle
{
private:
double height;
public:
cone(double r,double h):circle(r)
{
height=h;
}
return 0;
}
实验二: circle1.h
class circle
{
protected:
double radius;
public:
circle(double r);
virtual ~circle();
};
class globe:public circle
{
public:
globe(double r):circle(r)
}
void student::set1()
{
set();
cout<<"请输入学生的班级名classname:\n";
cin>>classname;
cout<<"请输入学生的成绩score:\n";
cin>>score;
}
void student::display1()
{
display();
cout<<"学生的班级名:"<<setw(10)<<classname<<" 学生的成绩:"<<setw(10)<<score<<endl;
char a,d;
int b;
int c;
student stud[max];
teacher teac[max];
while(1)
{
cout<<"请问你是否需要输入学生信息?(y/n)\n";
cin>>a;
if(a=='y'||a=='Y')
{
cout<<"请问你要输入几个学生的信息(n不大于1000人)";
}
void teacher::set2()
{
set();
cout<<"请输入教师的职业名:\n";
cin>>occupation;
cout<<"请输入教师的部门:\n";
cin>>department;
}
void teacher::display2()
{
display();
cout<<"教师的职业名:"<<setw(10)<<occupation<<" 教师的部门:"<<setw(10)<<department<<endl;
};
class student:public person