c面向对象课后答案解析.docx
- 文档编号:10929110
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:20
- 大小:39.37KB
c面向对象课后答案解析.docx
《c面向对象课后答案解析.docx》由会员分享,可在线阅读,更多相关《c面向对象课后答案解析.docx(20页珍藏版)》请在冰豆网上搜索。
c面向对象课后答案解析
1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,
那么默认的派生方式为private.
1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保
护成员;私有成员成为派生类的不能直接访问成员.当保护派生时,基类的公有成员成
为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直
接访问成员.
1.3派生类的构造函数一般有3项工作要完成:
首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体.
1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性.在
派生类中采用虚基类或作用域分辨符来消除该问题.
2.简做题
2.1派生类如何实现对基类私有成员的访问
2.2什么是类型兼容规那么
2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的
2.4继承与组合之间的区别与联系是什么
2.5什么是虚基类它有什么作用含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚
基类的初始化
3.选择题
3.1下面对派生类的描述中,错误的选项是〔D〕.
A.一个派生类可以作为另外一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类中保持不变
3.2以下对友元关系表达正确的选项是〔A〕.
A.不能继承
B.是类与类的关系
C.是一个类的成员函数与另一个类的关系
D.提升程序的运行效率
3.3当保护继承时,基类的〔B〕在派生类中成为保护成员,不能通过派生类的对象来直接
访问.
3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的表达是〔C〕.
A.派生类的对象可以赋给基类的对象
B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员
D.派生类的对象的地址可以赋给指向基类的指针
3.6有如下类定义:
classMyBASE{
intk;
public:
voidset(intn){k=n;}
intget()const{returnk;}
};
classMyDERIVED:
protectedMyBASE{
protected;
intj;
public:
voidset(intm,intn){MyBASE:
:
set(m);j=n;}
intget()const{returnMyBASE:
:
get()+j;}
};
那么类MyDERIVED中保护成员个数是(B).
A.4B.3C.2D.1
3.7程序如下:
#include
usingnamespacestd;
classA{
public:
A(){cout<<"A";}};
classB{public:
B(){cout<<"B";}};
classC:
publicA{
Bb;
public:
C(){cout<<〞C;}
};
intmain(){Cobj;return0;}
执行后的输出结果是(D).
A.CBAB.BACC.ACBD.ABC
3.8类.定义了私有函数F1°P和Q为.的派生类,定义为classP:
protected.{…};class
Q:
publicO{…}.(C)可以访问FL
A.O的对象B.P类内C..类内D.Q类内
3.9有如下类定义:
classXA{
intx;
public:
XA(intn){x=n;}
};
classXB:
publicXA{
inty;
public:
XB(inta,intb);
);
在构造函数XB的以下定义中,正确的选项是(
A.XB:
:
XB(inta
B.XB:
:
XB(inta
C.XB:
:
XB(inta
D.XB:
:
XB(inta
3.10有如下程序:
#include
usingnamespacestd;
classBase{private:
voidfun1()const{cout< voidfun2()const{cout< voidfun3()const{cout<< ); classDerived: protectedpublic: voidfun4()const{cout<< ); intb) intb) intb) intb) B). x(a),y(b){} XA(a),y(b){}x(a),XB(b){} XA(a),XB(b){} funl〞;} fun2;} fun3";} Base{ "fun4〞;} intmain(){ Derivedobj; obj.fun1();〃① obj.fun2();//② obj.fun3();//③ obj.fun4();〃④ ) 其中没有语法错误的语句是(D). A.CDB.②C.③D.④ 4.写出程序运行结果 4.l#include usingnamespacestd; classB1{ public: B1(inti){cout<<"constructingB1"< ~B1(){cout<<"destructingB1"< }; classB2{ public: B2(){cout<<"constructingB3*“< ~B2(){cout<<〞destructingB3〞< classC: publicB2,virtualpublicB1{ intj; public: C(inta,intb,intc): B1(a),memberB1(b),j(c){}private: B1memberB1; B2memberB2; }; intmain(){ Cobj(1,2,3); } constructingB11 constructingB3* constructingB12 constructingB3* destructingB3 destructingB1 destructingB3 destructingB1 4.2#include classB{ public: voidf1(){cout<<"B: : f1"< ); classD: publicB{ public: voidf1(){cout<<"D: : f1"< }; voidf(B&rb){ rb.f1(); } intmain(){ Dd; Bb,&rb1=b,&rb2=d; f(rb1);f(rb2); return0; } B: : f1 B: : f1 5.编程题 5.1定义一个Point类,派生出Rectangle类和Circle类,计算各派生类对象的面积Area #include usingnamespacestd; constdoublePI=3.14159; classPoint{ public: Point(doublex=0,doubley=0){X=x;Y=y;} voidShowPoint(){cout<<"("< private: doubleX,Y; }; classRectangle: publicPoint{ public: Rectangle(doublew,doubleh,doublex,doubley): Point(x,y) {width=w,height=h;Area();} voidArea(){area=width*height;} voidShowArea(){ cout<<"RectangleArea="< } private: doublewidth,height,area; }; classCircle: publicPoint{ public: Circle(doubler,doublex,doubley): Point(x,y) {radius=r;Area();} voidArea(){area=PI*radius*radius;} voidShowArea(){ cout<<"CircleArea="< } private: doubleradius,area; }; intmain(){ Rectangler(10,8,0,0); Circlec(4,3,5); r.ShowArea(); c.ShowArea(); return0; } 5.2设计一个建筑物类Building,由它派生出教学楼Teach-Building和宿舍楼类 Dorm-Building,前者包括教学楼编号、层数、教室数、总面积等根本信息,后者包括宿 舍楼编号、层数、宿舍数、总面积和容纳学生总人数等根本信息. #include #include enumAMPM{AM=1,PM}; classBuilding{ public: Building(char*); voidShowBuilding(){ cout< } protected: charName[30]; }; Building: : Building(char*name){strcpy(Name,name); }; classTeach_Building: publicBuilding{ public: Teach_Building(char*,int,int,int,int); voidShowTeach_Building(){ Building: : ShowBuilding(); cout<<"No: "< cout<<"Floors: "< cout<<"ClassRooms: "< cout<<"Area: "< ) protected: intNo,Floors,ClassRooms,Area; ); Teach_Building: : Teach_Building(char*name,intno,intfl,intcr,intar): Building(name){ No=no;Floors=fl;ClassRooms=cr;Area=ar; ) classDorm_Building: publicBuilding{ public: Dorm_Building(char*,int,int,int,int,int); voidShowDorm_Building(){ Building: : ShowBuilding(); cout<<"No: "< cout<<"Floors: "< cout<<"DormRooms: "< cout<<"Area: "< cout<<"StudentNum: "< ) protected: intNo,Floors,DormRooms,Area,StudentNum; ); sn): Building(name){ No=no;Floors=fl;DormRooms=dr;Area=ar;StudentNum=sn; intmain(){ Teach_Buildingtb("主教学楼",59,6,66,18000); Dorm_Buildingdb("北苑男生宿舍〞,41,5,75,3750,300); tb.ShowTeach_Building(); db.ShowDorm_Building(); return0; 〕 5.3定义并描述一个Table类和一个Circle类,由它们共同派生出RoundTable类. 〔这题做得不太满意〕 #include classTable{public: Table(intlegs){ Legs=legs; protected: intLegs; ); classCircle{ public: Circle(intradius){ Radius=radius; ) protected: intRadius; ); classRoundTable: publicTable,publicCircle{ public: RoundTable(intlegs,intradius): Table(legs),Circle(radius){} protected: }; intmain(){ return0; NewClock. } 5.4利用第四章习题5.2Clock类,派生一个带“AM〞、“PM〞的新时钟类#include enumAMPM{AM=1,PM}; classClock{ public: Clock(int=0,int=0,ints=0); voidShowTime(){ cout< "< "< } private: intHour,Minute,Second; }; Clock: : Clock(inth,intm,ints){ Hour=h;Minute=m;Second=s; }; classNewClock: publicClock{ public: NewClock(); NewClock(Clockc,AMPMap): Clock(c){ Ap=ap; }voidShowTime(){ Clock: : ShowTime(); cout<<(Ap==AM? "AM": "PM")< ) private: AMPMAp; ); intmain(){ NewClocknc(Clock(8,23,34),AMPM (2)); nc.ShowTime(); return0; ) 5.5利用NewClock类与Date类定义一个带日期的时钟类ClockwithDate.对该类对象 能进行增加减少秒数操作. #include usingnamespacestd; enumAMPM{AM=1,PM}; classClock{ public: Clock(int=0,int=0,ints=0); voidShowTime(){ cout< "< "< ) protected: intHour,Minute,Second; ); Clock: : Clock(inth,intm,ints){ Hour=h;Minute=m;Second=s; ); classNewClock: publicClock{ public: NewClock(Clockc,AMPMap): Clock(c){ Ap=ap; ) voidShowTime(){ Clock: : ShowTime(); cout<<(Ap==AM? "AM": "PM")< ) protected: AMPMAp; ); classDate{ protected: intYear,Month,Day; staticconstintdays[]; boolLeapYear(); boolEndofMonth(); public: Date(int=1900,int=1,int=1); voidIncrement(int); voidDecrement(int); voidSetDate(int,int,int); voidShowDate(); }; constintDate: : days[尸{0,31,28,31,30,31,30,31,31,30,31,30,31}; Date: : Date(inty,intm,intd){ SetDate(y,m,d); } voidDate: : SetDate(inty,intm,intd){ Year=(y>=1900&&y<=9999)? y: 1900; Month=(m>=1&&m<=12)? m: 1; if(Month==2&&LeapYear()) Day=(d>=1&&d<=29)? d: 1; else Day=(d>=1&&d<=days[Month])? d: 1; ) boolDate二LeapYear(){ return((Year%400==0)||(Year%4==0&&Year%100! =0))? true: false; ) boolDate: : EndofMonth(){ if(Month==2&&LeapYear()) returnDay==29; else returnDay==days[Month]; ) voidDate: : Increment(intn){ inti; for(i=1;i<=n;i++) if(EndofMonth()&&Month==12){ Year++;Month=Day=1; ) elseif(EndofMonth()){ Month++;Day=1; ) else Day++; ) voidDate: : Decrement(intn){ inti; for(i=1;i<=n;i++) if(Day==1){ if(Month==1){ Year--;Month=12;Day=31; ) elseif(Month==3){ Day=LeapYear()? 29: 28;Month=2; ) else Day=days[--Month]; ) else Day--; )voidDate: : ShowDate(){cout< ) classClockwithDate: publicDate,publicNewClock{ public: ClockwithDate(Date,Clock,AMPM); voidIncrementSecond(int); voidDecrementSecond(int); voidShowDateandTime(){ Date: : ShowDate(); NewClock: : ShowTime(); ) ); ClockwithDate: : ClockwithDate(Dated,Clockc,AMPMap): Date(d),NewClock(c,ap){} voidClockwithDate: : IncrementSecond(intn){ inti; for(i=1;i<=n;i++){ Second++; if(Second==60){ Second=0; Minute++; if(Minute==60){ Minute=0; Hour++; if(Hour==24){ Hour=0; Date: : Increment (1); ) ) ) ) ) voidClockwithDate二DecrementSecond(intn){inti; for(i=1;i<=n;i++){ Second--; if(Second==-1){ Second=59; Minute--; if(Minute==-1){ Minute=59; Hour--; if(Hour==-1){ Hour=23; Date: : Decrement (1); ) ) ) ) ) intmain(){ ClockwithDatecd(Date(2007,2,28),Clock(23,59,34),AMPM (2)); cd.ShowDateandTime(); cd.IncrementSecond(27); cd.ShowDateandTime(); cd.DecrementSecond(27); cd.ShowDateandTime(); return0; ) 5.6编写一个程序实现小型公司的工资治理.该公司主要有4类人员: 经理(main-ager)、技术人员(technician)、销售员(salesman)、销售经理(salesmanager).这些人员都是职员(employee),有编号、姓名、月工资信息.月工资的计算方法是: 经理固定月薪8000元,技术人员每小时100元,销售员按当月销售额4%提成,销售经理既拿固定月工 资5000元也拿销售提成,销售提成为所管辖部门当月销售额的5%°.要求编程计算职员的 月工资并显示全部信息. 见教材[例8-10]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 课后 答案 解析