实验七 继承与派生
- 格式:doc
- 大小:48.00 KB
- 文档页数:4
c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论: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来创建具体的按钮和文本框。
这样,我们可以通过继承和派生的方式,实现不同的界面元素,并且可以在派生类中添加新的功能,如按钮的点击事件和文本框的输入验证。
继承与派生的注意事项:在使用继承与派生的过程中,我们需要注意一些问题。
首先,派生类可以访问基类的公有成员,但不能访问基类的私有成员。
西安财经学院信息学院《面向对象方法及程序设计》 实验报告实验名称 继承与派生 实验室 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++语言程序设计实验答案_继承与派生实验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.(编程)声明基类Animal,成员变量age声明为私有的。
构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)把age改为公有变量后重新编译就可以了。
实验目的与要求: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.学习定义和使用类的继承关系,定义派生类2.熟悉不同继承方式下对基类成员的访问控制实验任务:1.定义一个基类Animal,有私有整形成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗2.定义一个基类BaseClass,有整形成员变量Number,构造其派生类,观察其构造函数和析构函数的执行情况。
3.定义一个车类(vehicle)基类,有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(Seatnum)等属性。
,在继承和过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题变成试试看。
实验步骤:1.编写程序定义Animal,成员变量age定义为私有的。
构造其派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现错误提示:程序名lab5_1.cpp2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。
程序名lab5_2.cpp3.用debug功能跟踪程序lab5_2.cpp的执行过程,观察基类和派生类的构造函数和析构函数的的执行过程。
4.编写程序定义车类(vehicle),由此派生出自行车(bicycle)类、汽车(motorcar),把vehicle设置为虚基类。
再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。
程序名lab5_3.cpp。
编译成功后把vehicle设置成非虚基类,在编译一次,此时系统报错,无法编译成功。
《C++程序设计》实验报告Exercise7继承与派生1实验目的(1)学习定义和使用类的继承关系,定义派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题。
2实验要求(1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还回有问题吗?编程试之。
源程序代码:#include<iostream>using namespace std;class Animal{public:Animal(){age=0;cout<<"构造了Animal对象"<<endl;}~Animal(){cout<<"析构了Animal对象"<<endl;}void display(){cout<<"Its age is"<<age<<"years old"<<endl;}int age;};class Dog:public Animal{public:Dog(){cout<<"构造了Dog对象"<<endl;}~Dog(){cout<<"析构了Animal对象"<<endl;}int setAge(int n){age=n;return age;}};int main(){Dog mimi;mimi.setAge(3);mimi.display();return0;}运行结果:(2)定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
实验七类的继承和派生一.实验目的与要求1.掌握类的继承与派生的实现方法。
2.熟悉单继承下派生类的构造函数和析构函数的设计。
3.掌握类成员的标识与访问方法。
4.熟悉类组合的设计方法和应用二. 实验任务1.已知交通工具类(vehicle)定义如下:class vehicle{protected:int wheels; // 车轮数public:vehicle(int wh=0);void init(int wh); //设置车轮数int get_wheels(); //返回车轮数void print(); //输出车轮数};要求:(1)实现vehicle类;(2)定义公有派生类:小车类(car)。
数据成员新增“载人数”;成员函数新增构造函数、init(设置车轮数和载人数),getpassenger(获取载人数),print (输出车轮数和载人数)。
2.已知点类(point)定义如下:class Point{private:double x,y;public:Point(double i=0,double j=0) ;double getx(); //返回x的值double gety(); //返回y的值};要求:(1)实现point类;(2)用组合的方法声明一个矩形类,数据成员包括矩形左上角和右下角两个点的坐标;成员函数包括构造函数、求矩形长、宽、周长以及面积的函数。
1、#include <iostream>#include <string>using namespace std;int wh,num;class vehicle{protected:int wheels;public:vehicle(){wheels=0;}vehicle(int wh){wheels=wh;}void init(int wh);int get_wheels();virtual void print();};void vehicle::init(int wh){wheels=wh;}int vehicle::get_wheels(){return(wheels);}void vehicle::print(){cout<<"车轮数为"<<wheels<<endl;}class car:public vehicle{protected:int number;public:car(){wheels=0;number=0;}car(int wh):vehicle(wh){wh=0;num=0;}car(int wh,int num):vehicle(wh){wheels=wh;number=num;} void init(int wh,int num);int getpassenger();virtual void print();};void car::init(int wh,int num){wheels=wh;number=num;}int car::getpassenger(){return(number);}void car::print(){cout<<"车轮数为"<<wheels<<endl;cout<<"载人数为"<<number<<endl; }int main(){int wh,num;vehicle vehicle1,vehicle2;vehicle1.get_wheels();vehicle1.print();cout<<"请输入车轮数"<<endl;cin>>wh;vehicle2.init(wh);vehicle2.get_wheels();vehicle *pt=&vehicle2;pt->print();car car1,car2;car1.getpassenger();car1.print();cout<<"请输入载人数"<<endl;cin>>num;car2.init(wh,num);car2.getpassenger();pt=&car2;pt->print();return 0;}2、#include <iostream>#include <cmath>using namespace std;class point{private:double x;double y;public:point(int i=0,int j=0);void Point(double i,double j);double getx();double gety();};point::point(double i,double j):x(i),y(j){}void point::Point(double i,double j){x=i;y=j;}double point::getx(){return(x);}double point::gety(){return(y);}class rectangular:public point{private:point p1;point p2;double length;double width;public:Rectangular(point p3,point p4):p1(p3),p2(p4){} double side();double perimeter();double area();};point rectangular::side(){double a,b,c,d;a=p1.getx();b=p2.getx();length=fabs(a-b);cout<<"length="<<length<<endl;c=p1.gety();d=p2.gety();width=fabs(c-d);cout<<"width="<<width<<endl;}double rectangular::perimeter(){return(2*(length+width));}double rectangular::area(){return(length*width);}int main(){int i,j,k,l,h,e;point p1,p2;cout<<"x="<<p1.getx()<<endl;cout<<"y="<<p1.gety()<<endl;cout<<"请输入矩形左下角和右上角两点坐标的横纵坐标值"<<endl;cin>>i>>j;p2.Point(i,j);cout<<"x="<<p2.getx()<<endl;cout<<"y="<<p2.gety()<<endl;rectangular rectangular1;rectangular(p1,p2);rectangular1.side();rectangular1.perimeter();cout<<"perimeter="<<rectangular1.perimeter()<<endl;rectangular1.area();cout<<"area="<<rectangular1.area()<<endl;return 0;}。
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
实验七继承与派生【实验目的】1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include <iostream.h>class A{public:A(){cout<<"Constructor1_A"<< x << endl;}A( int m ) : x( m ){cout<<"Constructor2_A"<< x << endl;}~A(){cout<<"Destructor_A"<< x << endl;}private:int x;};class B : public A{public:B(){cout<<"Constructor1_B"<< y << endl;}B( int m, int n, int l ) : A( m ), a( n ), y( l ){cout<<"Constructor2_B"<< y <<endl;}~B(){cout<<"Destructor_B"<< y << endl;}private:A a;int y;};int main(){B b1, b2(5,6);return 0;}2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
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 继承与派生实验报告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,我们可以看到其对程序运行结果的影响。
这种灵活性,使得我们可以根据具体需求,定制不同的派生类,实现更加个性化的功能。
实验七继承与派生
【实验目的】
1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】
1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include <iostream.h>
class A
{
public:
A()
{
cout<<"Constructor1_A"<< x << endl;
}
A( int m ) : x( m )
{
cout<<"Constructor2_A"<< x << endl;
}
~A()
{
cout<<"Destructor_A"<< x << endl;
}
private:
int x;
};
class B : public A
{
public:
B()
{
cout<<"Constructor1_B"<< y << endl;
}
B( int m, int n, int l ) : A( m ), a( n ), y( l )
{
cout<<"Constructor2_B"<< y <<endl;
}
~B()
{
cout<<"Destructor_B"<< y << endl;
}
private:
A a;
int y;
};
int main()
{
B b1, b2(5,6);
return 0;
}
2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
#include<iostream.h>
class Base{
protected:
int x;
public:
Base(){x=0;}
};
class Base1:public Base{
public:
Base1(){}
};
class Base2:public Base{
public:
Base2(){}
};
class Derived: public Base1,public Base2
{
public:
Derived(){}
void Init(int x1,int x2)
{
Base1::x=x1 ;
Base2::x=x2 ;
}
void output(){cout<<Base1::x<<' '<<Base2::x<<endl;}
};
void main()
{
Derived d;
d.Init(5,9);
d.output();
}
3、在下面一段类定义中,Derived类公有继承了基类Base。
需要填充的函数有注释内容给出了功能。
#include<iostream.h>
class Base{
private:
int mem1,mem2;
public:
Base(int m1,int m2)
{mem1=m1;mem2=m2;}
void output(){cout<<mem1<<' '<mem2<<'';}
};
class Derived:public Base
{
private:
int mem3;
public:
//构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3 Derived(int m1,int m2,int m3);
//输出mem1,mem2和mem3数据成员的值
void output(){
(1) ;
cout<<mem3<<endl;}
};
Derived::Derived(int m1,int m2,int m3): (2)
{ (3) ;}
4、上机分析下面程序,掌握静态成员
include <iostream.h>
class sample
{
public:
sample ( ){ ++n; }
static int HM(){ return n; }
~sample ( ){ --n; }
private:
static int n;
};
int sample::n = 10;
int main()
{
sample c1,c2;
sample *p = new sample();
cout<<sample::HM()<<endl;
delete p;
cout<<sample::HM()<<endl;
return 0;
}
5、设计一个具有继承和派生的类,分析程序输出结果,理解类的继承与派生。
参考程序:
#include <iostream.h>
class A
{
public:
void f(int i)
{cout<<i<<endl;}
void g()
{cout<<"g\n";}
};
class B:A
{
public:
void h(){cout<<"h\n";}
A::f;
};
void main()
{
B d1;
d1.f(6);
d1.g();
d1.h();
}
问题:
⑴、执行该程序时,哪个语句会出现编译错误?为什么?
⑵、去掉出错语句后,执行该程序后输出结果如何?
⑶、程序中派生类B是从基类A中继承来的,这种缺省继承方式是哪种继承方式?
⑷、派生类B中,A::f的含意是什么?
⑸、将派生类B的继承改为公有继承方式该程序将输出什么结果?。