C++实验2.docx
- 文档编号:23404311
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:164.19KB
C++实验2.docx
《C++实验2.docx》由会员分享,可在线阅读,更多相关《C++实验2.docx(18页珍藏版)》请在冰豆网上搜索。
C++实验2
实验二类和对象
实验课程名:
面向对象程序设计(C++)
专业班级:
09计算机科学与技术
(2)班学号:
姓名:
实验时间:
实验地点:
K4-102指导教师:
一、实验目的和要求
(1)掌握派生类的声明方法和派生类构造函数的定义方法。
(2)掌握不同继承方式下,基类成员在派生类中的访问属性。
(3)掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。
(4)学习虚基类在解决二义性问题中的作用。
二、实验内容
(一)输入下列程序
#include
usingnamespacestd;
classBase{
public:
voidsetx(inti)
{x=i;}
intgetx()
{returnx;}
public:
intx;
};
classDerived:
publicBase{
public:
voidsety(inti)
{y=i;}
intgety()
{returny;}
voidshow()
{cout<<"Base:
:
x="< } public: inty; }; intmain() {Derivedbb; bb.setx(16); bb.sety(25); bb.show(); cout<<"Base: : x="< cout<<"Derived: : y="< cout<<"Base: : x="< cout<<"Derived: : y="< 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)程序代码 #include #include usingnamespacestd; classperson {private: intno; stringname; stringssex; intage; public: voidinput() {cout<<"请输入编号和姓名: "; cin>>no>>name; cout<<"请输入性别和年龄: "; cin>>ssex>>age; } voiddisplay() {cout<<"编号: "< cout<<"姓名: "< cout<<"姓别: "< cout<<"年龄: "< } }; classstudent: publicperson {private: intbh,score; public: voidget() {input(); cout<<"请输入班号和成绩: "; cin>>bh>>score;} voidshow() {display(); cout<<"班号: "< cout<<"成绩: "< }; classteacher: publicperson {private: stringzc,bm; public: voidget() {input(); cout<<"请输入职称和部门: "; cin>>zc>>bm;} voidshow() {display(); cout<<"职称: "< cout<<"部门: "< }; 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)阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。 #include #include usingnamespacestd; classMyArray{ public: MyArray(intleng); ~MyArray(); voidInput(); voidDisplay(string); protected: int*alist; intlength; }; MyArray: : MyArray(intleng) {if(leng<=0) {cout<<"errorlength"; exit (1); } alist=newint[leng]; length=leng; if(alist==NULL) {cout<<"assignfailure"; exit (1); } cout<<"MyArray类对象已创建。 "< } MyArray: : ~MyArray() {delete[]alist; cout<<"MyArray类对象被撤销。 "< } voidMyArray: : Display(stringstr) {inti; int*p=alist; cout< "; for(i=0;i cout<<*p<<""; cout< } voidMyArray: : Input() {cout<<"请键盘输入"< "; inti; int*p=alist; for(i=0;i cin>>*p; } intmain() {MyArraya(5); a.Input(); a.Display("显示已输入的"); return0; } 程序运行结果: (2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。 程序代码 #include #include usingnamespacestd; classMyArray{ public: MyArray(intleng); ~MyArray(); voidInput(); voidDisplay(string); protected: int*alist; intlength; }; MyArray: : MyArray(intleng) {if(leng<=0) {cout<<"errorlength"; exit (1); } alist=newint[leng]; length=leng; if(alist==NULL) {cout<<"assignfailure"; exit (1); } cout<<"MyArray类对象已创建。 "< } MyArray: : ~MyArray() {delete[]alist; cout<<"MyArray类对象被撤销。 "< } voidMyArray: : Display(stringstr) {inti; int*p=alist; cout< "; for(i=0;i cout<<*p<<""; cout< } voidMyArray: : Input() {cout<<"请键盘输入"< "; inti; int*p=alist; for(i=0;i cin>>*p; } classSortArray: publicMyArray{ public: voidSort(); SortArray(intleng): MyArray(leng) {cout<<"SortArray类对象已创建。 "< } virtual~SortArray(); }; SortArray: : ~SortArray() {cout<<"SortArray类对象被撤销。 "< } voidSortArray: : Sort() { for(inti=0;i for(intj=i;j if(alist[j] {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,在该类中定义一个函数,具有将输入的整数进行倒置的功能。 程序代码 #include #include usingnamespacestd; classMyArray{ public: MyArray(intleng); ~MyArray(); voidInput(); voidDisplay(string); protected: int*alist; intlength; }; MyArray: : MyArray(intleng) {if(leng<=0) {cout<<"errorlength"; exit (1); } alist=newint[leng]; length=leng; if(alist==NULL) {cout<<"assignfailure"; exit (1); } cout<<"MyArray类对象已创建。 "< } MyArray: : ~MyArray() {delete[]alist; cout<<"MyArray类对象被撤销。 "< } voidMyArray: : Display(stringstr) {inti; int*p=alist; cout< "; for(i=0;i cout<<*p<<""; cout< } voidMyArray: : Input() {cout<<"请键盘输入"< "; inti; int*p=alist; for(i=0;i cin>>*p; } classReArray: publicMyArray{ public: voidreverse(); ReArray(intleng): MyArray(leng) {cout<<"ReArray类对象已创建。 "< } virtual~ReArray(); }; ReArray: : ~ReArray() {cout<<"ReArray类对象被撤销。 "< } voidReArray: : reverse() { for(inti=0;i {intm=alist[length-1-i]; alist[length-1-i]=alist[i]; alist[i]=m;} } intmain() {ReArrays(5); s.Input(); s.Display("显示倒置以前的"); s.reverse(); s.Display("显示倒置以后的"); return0; } 程序运行结果: 程序分析 在程序中声明一个类ReArray继承类MyArray,继承方式为公有继承。 当创建派生类对象时,首先执行基累的构造函数,随后执行派生类的构造函数,这可以从程序运行结果看出。 在程序功能上利用基类函数进行输入和输出数据,在派生类中定义一个函数,将输入的整数进行倒置,再调用基类输出函数进行输出。 (4)声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入的整数平均值的功能。 程序代码: #include #include usingnamespacestd; classMyArray{ public: MyArray(intleng); ~MyArray(); voidInput(); voidDisplay(string); protected: int*alist; intlength; }; MyArray: : MyArray(intleng) {if(leng<=0) {cout<<"errorlength"; exit (1); } alist=newint[leng]; length=leng; if(alist==NULL) {cout<<"assignfailure"; exit (1); } cout<<"MyArray类对象已创建。 "< } MyArray: : ~MyArray() {delete[]alist; cout<<"MyArray类对象被撤销。 "< } voidMyArray: : Display(stringstr) {inti; int*p=alist; cout< "; for(i=0;i cout<<*p<<""; cout< } voidMyArray: : Input() {cout<<"请键盘输入"< "; inti; int*p=alist; for(i=0;i cin>>*p; } classAverArray: publicMyArray{ public: doubleAver(); AverArray(intleng): MyArray(leng) {cout<<"AverArray类对象已创建。 "< } virtual~AverArray(); }; AverArray: : ~AverArray() {cout<<"AverArray类对象被撤销。 "< } doubleAverArray: : Aver() {doublem=0; for(inti=0;i { m=alist[i]+m;} cout<<"显示"< "; returnm/length; } intmain() {AverArrays(5); s.Input(); s.Display("显示"); cout< return0; } 程序运行结果: 程序分析: 在程序中声明一个类AverArray继承类MyArray,继承方式为公有继承。 当撤销创建派生类对象时,首先执行派生类的析构函数,随后执行基类的析构函数,这可以从程序运行结果看出。 在程序功能上利用基类函数进行输入和输出数据,在派生类中定义一个函数Aver(),求输入的整数平均值,再输出平均值。 3、结论 通过本次试验我掌握派生类的声明方法和派生类构造函数的定义方法。 派生类有三种继承方式,私有继承、公有继承、保护继承。 在不同继承方式下,基类成员在派生类中的访问规则不同。 在程序中要能准确分辨内部访问和对象访问,判断其对基类成员的访问权限。 特别要注意对于基类中的私有成员,这两种访问方式均不可访问。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验