您好,欢迎访问三七文档
实验二类和对象实验课程名:面向对象程序设计(C++)专业班级:09计算机科学与技术(2)班学号:姓名:实验时间:实验地点:K4-102指导教师:一、实验目的和要求(1)掌握派生类的声明方法和派生类构造函数的定义方法。(2)掌握不同继承方式下,基类成员在派生类中的访问属性。(3)掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。(4)学习虚基类在解决二义性问题中的作用。二、实验内容(一)输入下列程序#includeiostreamusingnamespacestd;classBase{public:voidsetx(inti){x=i;}intgetx(){returnx;}public:intx;};classDerived:publicBase{public:voidsety(inti){y=i;}intgety(){returny;}voidshow(){coutBase::x=xendl;}public:inty;};intmain(){Derivedbb;bb.setx(16);bb.sety(25);bb.show();coutBase::x=bb.xendl;coutDerived::y=bb.yendl;coutBase::x=bb.getx()endl;coutDerived::y=bb.gety()endl;return0;}(1)写出程序的运行结果。(2)按以下要求,对程序进行修改后再调试,指出调试中出错的原因。错误!未找到引用源。将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?为什么?错误!未找到引用源。将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什么?错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么?错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?解答:(1)运行结果:(2)调试中出错的原因:①将基类Base中数据成员x的访问权限改为private时,出现错误“errorC2248:'x':cannotaccessprivatememberdeclaredinclass'Base'”。在公有继承中,内部访问和对象访问均不能访问基类Base的私有成员x。错误!未找到引用源。将基类Base中数据成员x的访问权限改为protected时,出现错误“errorC2248:'x':cannotaccessprivatememberdeclaredinclass'Base'”。在公有继承中,对象访问不能访问基类Base的保护成员x。错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为private时,出现错误“errorC2248:'x':cannotaccessprivatememberdeclaredinclass'Base'”。在私有继承中,对象访问不能访问基类Base的公有成员x,setx(inti),getx()。错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为protected时,出现错误“errorC2248:'x':cannotaccessprivatememberdeclaredinclass'Base'”。在保护继承中,对象访问不能访问基类Base的公有成员x,setx(inti),getx()。(二)编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。供参考的类结构如下:classPerson{...};classStudent:publicPerson{...};classTeacher:publicPerson{...};(1)程序代码#includeiostream#includestringusingnamespacestd;classperson{private:intno;stringname;stringssex;intage;public:voidinput(){cout请输入编号和姓名:;cinnoname;cout请输入性别和年龄:;cinssexage;}voiddisplay(){cout编号:noendl;cout姓名:nameendl;cout姓别:ssexendl;cout年龄:ageendl;}};classstudent:publicperson{private:intbh,score;public:voidget(){input();cout请输入班号和成绩:;cinbhscore;}voidshow(){display();cout班号:bhendl;cout成绩:scoreendl;}};classteacher:publicperson{private:stringzc,bm;public:voidget(){input();cout请输入职称和部门:;cinzcbm;}voidshow(){display();cout职称:zcendl;cout部门:bmendl;}};intmain(){students;teachert;s.get();s.show();t.get();t.show();return0;}(2)程序运行结果:(3)程序分析这个程序主要是讲公有继承方式的派生类对基类成员的访问规则。在基类person中有四个私有成员no、name、ssex、age,两个公有函数input()、display()。在派生类Student和teacher中分别新增私有数据成员bh、score和zc、bm,公有成员函数get()、show()。在两个派生类中调用input()、display()就能输出对象的编号、姓名、性别、年龄。(三)按要求阅读、编辑、编译、调试和运行以下程序。(1)阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。#includeiostream#includestringusingnamespacestd;classMyArray{public:MyArray(intleng);~MyArray();voidInput();voidDisplay(string);protected:int*alist;intlength;};MyArray::MyArray(intleng){if(leng=0){couterrorlength;exit(1);}alist=newint[leng];length=leng;if(alist==NULL){coutassignfailure;exit(1);}coutMyArray类对象已创建。endl;}MyArray::~MyArray(){delete[]alist;coutMyArray类对象被撤销。endl;}voidMyArray::Display(stringstr){inti;int*p=alist;coutstrlength个整数:;for(i=0;ilength;i++,p++)cout*p;coutendl;}voidMyArray::Input(){cout请键盘输入length个整数:;inti;int*p=alist;for(i=0;ilength;i++,p++)cin*p;}intmain(){MyArraya(5);a.Input();a.Display(显示已输入的);return0;}程序运行结果:(2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。程序代码#includeiostream#includestringusingnamespacestd;classMyArray{public:MyArray(intleng);~MyArray();voidInput();voidDisplay(string);protected:int*alist;intlength;};MyArray::MyArray(intleng){if(leng=0){couterrorlength;exit(1);}alist=newint[leng];length=leng;if(alist==NULL){coutassignfailure;exit(1);}coutMyArray类对象已创建。endl;}MyArray::~MyArray(){delete[]alist;coutMyArray类对象被撤销。endl;}voidMyArray::Display(stringstr){inti;int*p=alist;coutstrlength个整数:;for(i=0;ilength;i++,p++)cout*p;coutendl;}voidMyArray::Input(){cout请键盘输入length个整数:;inti;int*p=alist;for(i=0;ilength;i++,p++)cin*p;}classSortArray:publicMyArray{public:voidSort();SortArray(intleng):MyArray(leng){coutSortArray类对象已创建。endl;}virtual~SortArray();};SortArray::~SortArray(){coutSortArray类对象被撤销。endl;}voidSortArray::Sort(){for(inti=0;ilength;i++)for(intj=i;jlength;j++)if(alist[j]alist[i]){intm=alist[j];alist[j]=alist[i];alist[i]=m;}}intmain(){SortArrays(5);s.Input();s.Display(显示排序以前的);s.Sort();s.Display(显示排序以后的);return0;}程序运行结果:程序分析:在程序中声明一个类SortArray继承类MyArray,继承方式为公有继承。若基类含有带参数的构造函数,在派生类中定义构造函数时,需缀上要调用的基类的构造函数及其参数,如本题中“SortArray(intleng):MyArray(leng)”。在程序功能上利用基类函数进行输入和输出数据,在派生类中定义一个函数,将输入的整数从小到大进行排序,再调用基类输出函数进行输出。(3)声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。程序代码#includeiostream#includestringusingnamespacestd;classMyArray{public:MyArray(intleng);~MyArray();voidInput();voidDisplay(string);protected:int*alist;intlength;};MyArray::MyArray(intleng){if(leng=0){couterrorlength;exit(1);}alist=newint[leng];length=leng;if(alist==NULL){coutas
本文标题:C++实验2
链接地址:https://www.777doc.com/doc-7027953 .html