1、内蒙古科技大学面向对象的程序设计实验8 继承一精编版内蒙古科技大学面向对象的程序设计实验报告课程名称:面向对象的程序设计姓名:陈伟光实验名称:继承(一)学号:1567159118任课教师:刘月峰专业:软件工程指导教师:刘月峰班级:15-软件一班一、实验目的1理解继承的含义以及声明;2理解共有派生、私有派生和保护派生的含义以及使用;3理解单派生类中构造函数和析构函数的调用顺序。二、实验环境编译器:Visual C+ 6.0.操作系统:Windows 7旗舰版三、实验内容2.1练习(一):1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.hc
2、lass CBasepublic:CBase(int a) :a(a)protected:void print() couta=aendl;private:int a;class CDerive : public CBasepublic:void print() CBase:print(); coutb=bendl;private:int b;void main()CDerive d;d.print();CBase b;b.print();问题一:以上程序有两大错误,试指出来,并改正之?2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.h
3、class CBasepublic:CBase(int a) :a(a) coutbase structureendl;CBase() coutbase destructureendl;void print() couta=aendl;protected:int a;class CDerive : public CBasepublic:CDerive(int a, int b,int c) :CBase(a),b(b),c(c) coutderive structureendl;CDerive() coutderive destructureendl;void print() CBase:pr
4、int(); coutb.a=b.aendl; coutc=cendl;private:CBase b;int c;void main()CDerive d(1,2,3); -d.print();问题一:以上程序的输出结果是什么,说明为什么?问题二:处语句执行完后,d.b.a的值为多少?2.2练习(二):1定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:aCLine类含有计算直线长度和斜率的成员函数;bCCircle类含有计算圆面积的成员函数。四、实验过程练习1实验题目源代码如下:直接编译结果如下:查看错因,首先前两句话写明
5、,在创建CBase和CDerive对象时候,没有传递参数,实际代码中CDerive根本没有正确的构造函数,代码区中加入一段带有初始化列表的构造函数第三句话指明基类对象b直接调用CBase类保护成员函数,属于类外调用,权限错误,此处可以将print的权限改为public修改后的代码如下:然后尝试编译运行:运行成功,符合题意练习2实验题目提供源代码如下:尝试编译:错误集中在基类成员数据a上,分析代码,CDerive类对象d创建时候一共有三个参数,1传递至派生类,再调用基类构造函数,3直接传递给派生类构造函数, 2传递给了派生类的中内嵌的基类成员对象,然而在公有继承下,派生类对象只能访问基类的公有数
6、据,所以此处将a的权限改为public,修改之后的代码如下:尝试编译运行:结果和代码本意相同,修改成功练习3根据题意,设计代码如下:面积计算以及斜率计算分别写在了CLine类和CCircle类的构造函数中,在创建对象的时候输入x2,y2 r即可算出距离和面积试运行结果如下:运行结果正确五、实验总结实验源代码:练习(一)#include iostream.hclass CBasepublic:CBase(int a):a(a) / protected:void print() /错误1.CBase类对象类外无法直接调用此主函数,应该改为public型couta=aendl;private:int
7、 a;class CDerive : public CBasepublic:CDerive(int a,int b):CBase(a),b(b) /错误2.构造函数错误,初始化列表和参数错误void print()CBase:print(); /保护继承下,派生类中可以访问基类的公有和保护数据coutb=bendl;private:int b;void main()CDerive d(0,0); /因为原题构造函数中有形参,所以创建要加上参数d.print();CBase b(0);b.print();/*#include iostream.hclass CBasepublic:CBase(i
8、nt a):a(a)protected:void print()couta=aendl;private:int a;class CDerive : public CBasepublic:void print()CBase:print();coutb=bendl;private:int b;void main()CDerive d;d.print();CBase b;b.print();*/练习(二)#include iostream.hclass CBasepublic:CBase(int a):a(a)coutbase structureendl;CBase()coutbase destru
9、ctureendl;void print()couta=aendl;public:int a;class CDerive : public CBasepublic:CDerive(int a, int b,int c):CBase(a),b(b),c(c)coutderive structureendl;CDerive()coutderive destructureendl;void print()CBase:print();coutb.a=b.aendl; /公有继承下派生类子对象只能访问基类的公有数据;coutc=cendl;private:CBase b;int c;void main(
10、)CDerive d(1,2,3);/ -d.print();/*1.没有任何输出结果,因为程序无法通过编译2.d.b.a的值为2 ,因为构造函数实参的第二个元素2,传递给CDerive类的子对象b,b.a被初始化为2*/*#include iostream.hclass CBasepublic:CBase(int a):a(a)coutbase structureendl;CBase()coutbase destructureendl;void print()couta=aendl;protected:int a;class CDerive : public CBasepublic:CDer
11、ive(int a, int b,int c):CBase(a),b(b),c(c)coutderive structureendl;CDerive()coutderive destructureendl;void print()CBase:print();coutb.a=b.aendl;coutc=cendl;private:CBase b;int c;void main()CDerive d(1,2,3); -d.print();*/练习(三)#include #include class CPointprivate:float x,y;public:CPoint(float x1,flo
12、at y1):x(x1),y(y1)cout-CPoint基类构造函数已调用-endl;void display()coutx= CPoint:x y= CPoint:yendl;class CLine:public CPointprivate:double k;double l;public:CLine(float x1,float y1):CPoint(x1,y1)cout-CLine派生类构造函数已调用-endl;float x2,y2;coutPlease input x2,y2:x2y2;l=sqrt(x1-x2)*(x1-x2)+(y2-y1)*(y2-y1);coutl:lend
13、l;if(y2-y1!=0)k=(y2-y1)/(x2-x1);coutk= kendl;elsecout分母为0,k不存在endl; ;class CCircle:public CPointprivate:double r;public:CCircle(float x1,float y1):CPoint(x1,y1)cout-CCircle派生类构造函数已调用-endl;coutplease input r:r;coutS= 3.14159*r*rendl;void main()float x1,y1;coutPlease input x1,y1:x1y1;CPoint CP(x1,y1);CP.display();CLine CL(x1,y1);CCircle CC(x1,y1);六、参考文献参考的资料:C+面向对象程序设计
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1