c++继承与派生习题答案.docx

上传人:b****8 文档编号:10944960 上传时间:2023-02-23 格式:DOCX 页数:20 大小:98.23KB
下载 相关 举报
c++继承与派生习题答案.docx_第1页
第1页 / 共20页
c++继承与派生习题答案.docx_第2页
第2页 / 共20页
c++继承与派生习题答案.docx_第3页
第3页 / 共20页
c++继承与派生习题答案.docx_第4页
第4页 / 共20页
c++继承与派生习题答案.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

c++继承与派生习题答案.docx

《c++继承与派生习题答案.docx》由会员分享,可在线阅读,更多相关《c++继承与派生习题答案.docx(20页珍藏版)》请在冰豆网上搜索。

c++继承与派生习题答案.docx

c++继承与派生习题答案

c++继承与派生习题答案

1.概念填空题

1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。

1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

1.3派生类的构造函数一般有3项工作要完成:

首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。

1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。

在派生类中采用虚基类或作用域分辨符来消除该问题。

2.简答题

2.1派生类如何实现对基类私有成员的访问?

2.2什么是类型兼容规则?

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类O定义了私有函数F1。

P和Q为O的派生类,定义为classP:

protectedO{…};classQ:

publicO{…}。

(C)可以访问Fl。

A.O的对象B.P类内C.O类内D.Q类内

3.9有如下类定义:

classXA{

intx;

public:

XA(intn){x=n;}

};

classXB:

publicXA{

inty;

public:

XB(inta,intb);

};

在构造函数XB的下列定义中,正确的是(B)。

A.XB:

:

XB(inta,intb):

x(a),y(b){}

B.XB:

:

XB(inta,intb):

XA(a),y(b){}

C.XB:

:

XB(inta,intb):

x(a),XB(b){}

D.XB:

:

XB(inta,intb):

XA(a),XB(b){}

3.10有如下程序:

#include

usingnamespacestd;

classBase{

private:

voidfun1()const{cout<<”fun1”;}

protected:

voidfun2()const{cout<<”fun2”;}

public:

voidfun3()const{cout<<”fun3”;}

};

classDerived:

protectedBase{

public:

voidfun4()const{cout<<”fun4”;}

};

intmain(){

Derivedobj;

obj.fun1();//①

obj.fun2();//②

obj.fun3();//③

obj.fun4();//④

}

其中没有语法错误的语句是(D)。

A.①B.②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

usingnamespacestd;

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

usingnamespacestd;

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;

};

Dorm_Building:

:

Dorm_Building(char*name,intno,intfl,intdr,intar,intsn):

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

usingnamespacestd;

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;

}

5.4利用第四章习题5.2Clock类,派生一个带“AM”、“PM”的新时钟类NewClock。

#include

usingnamespacestd;

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‰。

要求编程计算职员的月工资并显示全部信息。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1