1、派生类与继承实验报告洛阳理工学院实验报告系别计算机与信息工程系班级B11050学号B11050姓名课程名称C+面向对象与程序设计实验日期2013.10.8实验名称派生类与继承成绩实验目的:1、 掌握派生类的声明方法和派生类构造函数的定义方法;2、 掌握不同继承方式下,基类成员在派生类中的访问属性;3、 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则;4、 学习虚基类在解决二义性问题中的作用。实验条件:装有Microsoft Visual C+6.0软件的计算机实验内容:1.输入下列程序。/test4_1.cpp#includeusing namespace std;class Bas
2、epublic:void setx(int i)x=i;Int getx()return x;public:int x;class Derived:public Basepublic:void sety(int i)y=i;int gety()return y;void show()cout”Base:x=”xendl;public:inty;int main()Derived bb;bb,setx(16);bb.sety(25);bb.show();cout”Base:x=”bb.xendl;cout”Derived:y=”bb.yendl;cout”Base:x=”bb.getx()end
3、l;cout”Derived:y=”bb.gety()endl;return 0;写出程序的运行结果。(2) 按以下要求,对程序进行修改后再调试,指出调试中出错的原因。将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?为什么?将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什么?在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么?在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?解答如下;将基类Base中数据成员x的访问权限改为private时,
4、会出现哪些错误?为什么?因为基类Base中数据成员x的访问权限改为private时,基类的私有成员在派生类中并没有成为派生类的私有成员,使得再通过派生类的对象调用x时,不能被系统所识别,出现了错误。将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什么?因为基类Base中数据成员x的访问权限改为protected时,公用基类的保护成员在公用派生类中的访问属性仍然是保护,在公用派生类外就不能通过公用派生类的对象访问该成员,所以出现了错误。在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么? 将派生类Derived的继承方式
5、改为private时,私有基类中的公用成员在私有派生类中的访问属性为私有,在类外不能通过对象调用私有成员,只能通过成员函数调用.在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?因为私有继承时基类中的公有函数到派生类中一是私有成员,不能通过对象访问,只能通过成员函数来访问。2.编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。供参考的类结构如下
6、:class Person.;class Student:public Person.;class Teacher:public Person.;程序代码:#include#includeusing namespace std; class Person public: Person(int n,string nam,char s,int a) num=n; name=nam; sex=s; age=a; Person() protected: int num; string name; char sex; int age; ; class Student:public Person publ
7、ic: Student(int n,string nam,char s,int a,string ap,int sc):Person( n,nam, s, a) apart=ap; score=sc; void show1() coutnum:numendl; coutname:nameendl; coutsex:sexendl; coutage:ageendl; coutapart:apartendl; coutscore:scoreendlendl; Student() private: string apart; int score; ;class Teacher:public Pers
8、on public: Teacher(int n,string nam,char s,int a,string z,string t):Person( n, nam, s, a) zhi=z title=t; void show2() coutnum:numendl; coutname:nameendl; coutsex:sexendl; coutage:ageendl; coutzhi:zhiendl; couttitle:titleendl; Teacher() private: string zhi; string title; ; int main() Student S(1001,y
9、ang-heng,f,21,computer,98); Teacher T(2009,li-sheng,f,35,manager,education); S.show1(); T.show2(); return 0; 程序运行结果:(3)调试程序时会出现以下错误:调用函数是应注意其访问权限,基类函数的私有成员只能被其成员函数访问,不能被派生类的对象和成员函数所访问,还要注意调用派生类的构造函数时的参数列表表达形式。(4)结果分析:注意构造函数和派生类调用基类的构造函数赋值,在后面对新增的参数初始化,通过对象赋值后再对其输出。 3.按要求阅读、编辑、编译、调试和运行以下程序。(1) 阅读、编辑、
10、编译、调试和运行以下程序,并写出程序的运行结果。 /test4_3_1.cpp#include#includeusing namespace std;class MyArraypublic:MyArray(int leng);MyArray();void Input();void Display(string);protected:int*alist;int length;MyArray:MyArray(int leng)if(leng=0)couterror length;exit(1);alist=new int leng;length=leng;if(alist=NULL)coutass
11、ign failure;exit(1);coutMyArray类对象已创建。endl;MyArray:MyArray()delete alist;coutMyArray类对象被撤销。endl;void MyArray:Display(string str)int i;int *p=alist;coutstrlength个整数:;for(i=0;ilength;i+,p+)cout*p;coutendl;void MyArray:Input()cout请键盘输入length个整数:;int i;int *p =alist;for(i=0;i*p;int main()MyArray a(5);a.
12、Input();a.Display(显示已输入的);return 0; (2) 声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。程序代码:#include#includeusing namespace std;class MyArray public: MyArray(int leng); MyArray(); void Input(); void Display(string );protected: int *alist; int length; ;class SortArray : public MyArray public
13、:void Sort();SortArray(int leng):MyArray(leng)coutSortArray类对象已创建。endl;virtual SortArray();SortArray:SortArray()coutSortArray类对象被撤销。endl;MyArray:MyArray(int leng) if(leng=0) couterror length; exit(1); alist=new int leng;length=leng;if(alist=NULL) coutassign failure;exit(1); coutMyArray类对象已创建。endl;My
14、Array:MyArray() delete alist;coutMyArray类对象被撤销。endl;void MyArray:Display(string str)int i;int *p=alist;coutstrlength个整数:;for(i=0;ilength;i+,p+)cout*p ;coutendl;void MyArray:Input()cout请键盘输入length个整数:;int i;int *p =alist;for(i=0;i*p;void SortArray:Sort() int temp,i,j; for(i=0;ilength-1;i+)for(j=0;jal
15、istj+1) temp=alistj; alistj=alistj+1; alistj+1=temp; int main()SortArray s(5);s.Input();s.Display(显示排序以前的);s.Sort();s.Display(显示排序以后的);return 0;程序运行结果:(2).声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。 程序代码:#include #include using namespace std; class MyArray public: MyArray(int leng); MyArray()
16、; void Input(); void Display(string); protected: int *alist; int length; ; class ReArray:public MyArray public: void reverse(); ReArray() coutReArray类对象被撤销。endl; ; ReArray(int leng):MyArray(leng) coutReArray类对象已创建。endl; ; MyArray:MyArray(int leng) if(leng=0) couterror length; exit(1); alist=new int
17、leng; length=leng; if(alist=NULL) coutassign failure; exit(1); coutMyArray类对象已创建。endl; MyArray:MyArray() delete alist; coutMyArray类对象被撤销。endl; void MyArray:Display(string str) int i; int *p=alist; coutstrlength个整数:; for(i=0;ilength;i+,p+) cout*p ; coutendl; void MyArray:Input() cout请键盘输入length个整数:;
18、int i; int *p =alist; for(i=0;i*p; void ReArray:reverse() int i,temp; for(i=0;ilength-2;i+) temp=alisti; alisti=alist4-i; alist4-i=temp; int main() ReArray a(5); a.Input();a.Display(显示已输入的);a.reverse();a.Display(显示已输出的);return 0;程序运行结果:(3) 声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入的整数平均值的功能。 程序代码:#in
19、clude#includeusing namespace std;class MyArray public: MyArray(int leng); MyArray(); void Input(); void Display(string );protected: int *alist; int length; ;MyArray:MyArray(int leng) if(leng=0) couterror length; exit(1); alist=new int leng;length=leng;if(alist=NULL) coutassign failure;exit(1); coutM
20、yArray类对象已创建。endl;MyArray:MyArray() delete alist;coutMyArray类对象被撤销。endl;void MyArray:Display(string str)int i;int *p=alist;coutstrlength个整数:;for(i=0;ilength;i+,p+)cout*p ;coutendl;void MyArray:Input()cout请键盘输入length个整数:;int i;int *p =alist;for(i=0;i*p;class AverArray:public MyArraypublic:AverArray(i
21、nt leng): MyArray(leng)coutMyArray类对象已创建。endl;AverArray()coutAverArray类对象被撤销。endl;double Aver();double AverArray: Aver()double sum=0,average;int i;for( i=0;ilength;i+)sum+=alisti;average=sum/length;cout平均数是:averageendl;return 0;int main()AverArray a(5);a.Input();a.Display(显示已输入的);a.Aver();return 0;程
22、序运行结果:(2)程序代码:#include#includeusing namespace std;class MyArray public: MyArray(int leng); MyArray(); void Input(); void Display(string );protected: int *alist; int length; ;MyArray:MyArray(int leng) if(leng=0) couterror length; exit(1); alist=new int leng;length=leng;if(alist=NULL) coutassign failu
23、re;exit(1); coutMyArray类对象已创建。endl;MyArray:MyArray() delete alist; coutMyArray类对象被撤销。endl;void MyArray:Display(string str) int i; int *p=alist; coutstrlength个整数:; for(i=0;ilength;i+,p+) cout*p ; coutendl; void MyArray:Input() cout请键盘输入length个整数:; int i; int *p =alist; for(i=0;i*p; class SortArray :v
24、irtual public MyArray public: void Sort(); SortArray(int leng):MyArray(leng) coutSortArray类对象已创建。endl; virtual SortArray();SortArray:SortArray()coutSortArray类对象被撤销。endl;void SortArray:Sort() int temp,i,j; for(i=0;ilength-1;i+) for(j=0;jalistj+1) temp=alistj; alistj=alistj+1; alistj+1=temp; class ReA
25、rray:virtual public MyArray public: void reverse(); ReArray(int leng); virtual ReArray(); ; ReArray:ReArray(int leng):MyArray(leng) if(leng=0) couterror length; exit(1); void ReArray:reverse() int i,temp; for(i=0;ilength-2;i+) temp=alisti; alisti=alist4-i; alist4-i=temp; ReArray:ReArray() coutReArray类对象被撤销。endl; class AverArray:virtual public MyArraypublic:AverArray(int leng): MyArray(leng)coutAyArray类对象已创建。endl;AverArray()coutAverArray类对象被撤销。endl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1