您好,欢迎访问三七文档
《面向对象程序设计》实验三实验报告班级电科2班学号Xb11640218姓名张俊为1实验目的(1)了解面向对象程序设计中继承性、多态性的概念;(2)掌握单继承、多重继承中基类成员访问属性的变化规律及访问方法;(3)掌握类族中构造函数和析构函数的定义方法及调用顺序;(4)掌握虚函数的定义和使用方法;2实验任务及结果分析(代码和分析结果)任务一:分别采用公有继承、私有继承、保护继承完成类的设计。#includeiostream#includestringusingnamespacestd;classstudent{public:voidget_value(){cinnumnamesex;}voiddisplay(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}private:intnum;stringname;charsex;};classstudent1:publicstudent{public:private:intage;charaddr[30];};voidstudent1::get_value_1(){cinageaddr;}voidstudent1::display_1(){coutage:ageendl;coutaddress:addrendl;}intmain(){studentstud;student1stud1;stud.get_value();stud1.get_value_1();stud.display();stud1.display_1();return0;voidget_value_1();voiddisplay_1();}任务二:对有继承关系的程序结构进行分析。classA{public:voidf1();inti;protected:voidf2();intj;private:intk;};classB:publicA{public:voidf3();protected:intm;private:intn;};classC:publicB{public:voidf4();private:intp;};intmain(){Aa1;Bb1;Cc1;return0;}问题:(1)在main函数中能否用通过派生类B的对象b1来引用从基类A继承来的成员i,j,k?答:因为B是A的派生类,i是A的公有成员,j是A的保护成员,k是A的私有成员,所以在类外中,i可以,j,k不可以(2)派生类B中的成员函数能否调用基类A中的成员函数f1、f2?答:因为B是A的派生类,f1是A的公有成员函数,f2是A的保护成员函数,所以f1,f2都可以访问(3)派生类B中的成员函数能否引用基类A中的i,j,k?答:因为B是A的派生类,i是A的公有成员,j是A的保护成员,k是A的私有成员,所以i,j能,k不能(4)能否在main函数中通过C类对象c1引用基类A的成员i,j,k类B的成员?答:因为C是A的派生类,i是A的公有成员,j是A的保护成员,k是A的私有成员,C是B的派生类,m是B的保护成员,n是B的私有成员,所以在类外,只有i能引用(5)能否在main函数中用C类对象c1以c1.f1(),c1.f2(),c1.f3(),c1.f4()的形式调用f1(),f2(),f3(),f4()?答:因为C是A的派生类,f1()是A的公有成员函数,f2()是A的保护成员函数,f3()是B的公有成员函数,f4()是C的公有成员函数,所以在类外,只有f2()无法被调用(6)派生类C的成员函数f4能否调用基类A的成员函数f1,f2及B类中的f3?答:因为C是A的派生类,C是B的派生类,f1()是A的公有成员函数,f2()是A的保护成员函数,f3()是B的公有成员函数,所以都可以被调用任务三:继承关系下,构造函数的调用顺序#includeiostreamusingnamespacestd;classA{public:A(){a=0;b=0;}A(inti){a=i;b=0;}A(inti,intj){a=i;b=j;}voiddisplay(){couta=ab=b;}private:inta;intb;};classB:publicA{public:B(){c=0;}B(inti):A(i){c=0;}B(inti,intj):A(i,j){c=0;}B(inti,intj,intk):A(i,j){c=k;}voiddisplay1(){display();coutc=cendl;}private:intc;};intmain(){Bb1;Bb2(1);Bb3(1,3);Bb4(1,3,5);b1.display1();b2.display1();b3.display1();b4.display1();return0;}问题:(1)阅读上述程序,写出运行时的输出结果;上机运行验证结果的正确性。(2)对程序结果进行分析,重点要指出构造函数的调用过程在main函数中,建立对象b1,b2,b3,b4,首先b1调用无参构造函数B(){c=0;},显示a=0,b=0,c=0的结果,b2调用带一个参数的构造函数B(inti):A(i){c=0;},显示出a=1,b=0,c=0的结果,b3调用带2个参数的构造函数B(inti,intj):A(i,j){c=0;},显示出a=1,b=3,c=0的结果,b4调用带3个参数的构造函数B(inti,intj,intk):A(i,j){c=k;},显示出a=1,b=3,c=5的结果(3)为上述A、B类添加析构函数,并分析析构函数在继承关系下的调用顺序。#includeiostreamusingnamespacestd;classA{public:A(){a=0;b=0;}~A(){coutAhasbeendestructe!endl;}A(inti){a=i;b=0;}A(inti,intj){a=i;b=j;}voiddisplay(){couta=ab=b;}private:inta;intb;};classB:publicA{public:B(){c=0;}~B(){coutBhasbeendestructe!endl;}B(inti):A(i){c=0;}B(inti,intj):A(i,j){c=0;}B(inti,intj,intk):A(i,j){c=k;}voiddisplay1(){display();coutc=cendl;}private:intc;};intmain(){Bb1;Bb2(1);Bb3(1,3);Bb4(1,3,5);b1.display1();b2.display1();b3.display1();b4.display1();return0;析构函数先调用B再调用A。任务四:参照教材例6.1,定义Point(点)类,由Point类派生出Circle(圆)类,再由Circle类派生出Cylinder(圆柱体)类。写一个虚函数用于输出类族中各类的名字。分析如果该函数不是虚函数,输出又将是怎样?为什么?#includeiostreamusingnamespacestd;classpoint{public:point(floata=0,floatb=0);voiddisplay_x();voiddisplay_y();protected:floatx,y;};public:cylinder(floata=0,floatb=0,floatc=0,floatd=0);voiddisplay_height();voiddisplay_area();voiddisplay_volume();protected:floath;};cylinder::cylinder(floata,floatb,floatc,floatd):circle(a,b,c),h(d){}point::point(floata,floatb){x=a;y=b;}voidpoint::display_x(){cout“x=”xendl;}voidpoint::display_y(){cout“y=”yendl;}classcircle:publicpoint{public:circle(floata=0,floatb=0,floatc=0);voiddisplay_radius();virtualvoiddisplay_area();protected:floatr;};circle::circle(floata,floatb,floatc):point(a,b),r(c){}voidcircle::display_radius(){cout”r=”rendl;}voidcircle::display_area(){cout“circlearea=”3.14*r*rendl;}classcylinder:publiccircle{voidcylinder::display_height(){cout“height=”hendl;}voidcylinder::display_area(){cout”cylinderarea=”2*3.14*r*r+2*3.14*r*hendl;}voidcylinder::display_volume(){cout”cylindervolume=”3.14*r*r*hendl;}voidmain(){circlec1(1,2,3);cylinderc2(1,2,3,4);c1.display_x();c1.display_y();c1.display_radius();c2.display_height();c2.display_volume();circle*p=&c1;p-display_area();p=&c2;p-display_area();}如果该函数不是虚函数,则输出结果为:因为当使pt指向cylinder,调用“p-display_area()”,但是没有定义虚函数,只能输出cylinder中基类的数据,只能调用circle的“p-display_area()”任务五:建立一个建筑物类的层次体系。其中,基类building包括保护数据成员name(建筑物名称)、floors(层数)和areas(总面积),由building类派生住宅类house和办公楼类office;住宅类house包括私有数据成员rooms(房间数)和balcony(阳台数);办公楼类office包括私有数据成员offices(办公室数)和meetingrooms(会议室数)。住宅类house和办公楼类office都含有构造函数和print函数,以分别用于对数据成员的初始化和输出。在主函数中,实例化house类和office类对象并且将其数据输出#include“iostream”#includestringusingnamespacestd;classbulding{protected:stringname;intfloors;floatareas;public:bulding(string,int,float);voidprint();};bulding::bulding(stringc,intn,floats)voidhouse::print(){coutname:name\nfloors:floors\nareas:areas\nrooms:rooms\nbalcony:balconyendl;}classoffice:publicbulding{public:office(stringc,intn,floats,inta,intb
本文标题:c++试验3
链接地址:https://www.777doc.com/doc-2901845 .html