C习题与解析继承和派生讲解.docx
《C习题与解析继承和派生讲解.docx》由会员分享,可在线阅读,更多相关《C习题与解析继承和派生讲解.docx(26页珍藏版)》请在冰点文库上搜索。
C习题与解析继承和派生讲解
C++习题与解析-继承和派生
6.1分析以下程序的执行结果
#include
classbase
{
public:
base(){cout<<"constrUCtingbaseclass"< ~base(){cout<<"destructingbaseclass"< };
classsubs:
publicbase
{
public:
subs(){cout<<"constructingsubclass"< ~subs(){cout<<"destructingsubclass"< };
voidmain()
{
subss;
}
解:
本题说明单继续情况下构造函数和析构函数的调用顺序。
这里base为基类,subs为派生类。
所以输出为:
constructingbaseclass
constructingsubclass
destructingsubclass
destrcutingbaseclass
注重:
在单继续情况下,首先调用基类的构造函数,随后调用派生类的构造函数,析构函数的调用顺序则正好相反。
6.2分析以下程序的执行结果:
#include
classbase
{
intn;
public:
base(inta)
{
cout<<"constructingbaseclass"< n=a;
cout<<"n="< }
~base(){cout<<"destructingbaseclass"< };
classsubs:
publicbase
{
basebobj;
intm;
public:
subs(inta,intb,intc):
base(a),bobj(c)
{
cout<<"constructingsubcass"< m=b;
cout<<"m="< }
~subs(){cout<<"destructingsubclass"< };
voidmain()
{
subss(1,2,3);
}
解:
本题说明派生类中含有对象成员情况下构造函数和析构函数的调用顺序。
这里base为基类,subs为派生类,subs类的构造函数中含有对象成员。
所以输出为:
constrcutingbaseclass
n=1
constructingbaseclass
n=3
constructingsubclass
m=2
destructingsubclass
destructingbaseclass
destructingbaseclass
注重:
当派生类中含有对象成员时,构造函数的调用顺序如下:
1)基类的构造函数
2)对象成员的构造函数
3)派生类的构造函数 析构函数的调用顺序与之相反
6.3分析以下程序的执行结果
#include
classA
{
public:
intn;
};
classB:
publicA{};
classC:
publicA{};
classD:
publicB,publicC
{
intgetn(){returnB:
:
n;}
};
voidmain()
{
Dd;
d.B:
:
n=10;
d.C:
:
n=20;
cout<:
n<<","<:
n< }
解:
D类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本。
所以对于对象d,d.B:
:
n与d.C:
:
n是两个不同的数据成员它们互无联系。
所以输出为:
10,20
6.4分析以下程序的执行结果
#include
classA
{
public:
intn;
};
classB:
virtualpublicA{};
classC:
virtualpublicA{};
classD:
publicB,publicC
{
intgetn(){returnB:
:
n;}
};
voidmain()
{
Dd;
d.B:
:
n=10;
d.C:
:
n=20;
cout<:
n<<","<:
n< }
解:
D类是从类和类派生的而类和类又都是从类派生,但这是虚继续关系即是虚基类因此和共用一个的副本所以对于对象d,d.B:
:
n与d.C:
:
n是一个成员。
所以输出为:
20,20
6.5假设图书馆的图书包含书名、编号作者属性读者饮包含姓名和借书证属性每位读者最多可借5本书,编写程序列出某读者的借书情况。
解:
设计一个类,从它派生出胃病书类book和读者类reader,在reader类中有一个rentbook()成员函数用于借阅图书。
程序代码如下:
本程序的执行结果如下:
#include
#include
classobject
{
charname[20];
intno;
public:
object(){}
object(charna[],intn)
{
strcpy(name,na);no=n;
}
voidshow()
{
cout< }
};
classbook:
publicobject
{
charauthor[10];
public:
book(){}
book(charna[],intn,charauth[]):
object(na,n)
{
strcpy(author,auth);
}
voidshowbook()
{
show();
cout<<"作者:
"< }
};
classreader:
publicobject
{
bookrent[5];
inttop;
public:
reader(charna[],intn):
object(na,n){top=0;}
voidrentbook(book&b)
{
rent[top]=b;
top++;
}
voidshowreader()
{
cout<<"读者:
";show();
cout<"< for(inti=0;i {
cout<<""<
";//5个空格
rent[i].show();
cout< }
}
};
voidmain()
{
bookb1("C语言",100,"谭浩强"),b2("数据结构",110,"严蔚敏");
readerr1("王华",1234);
r1.rentbook(b1);
r1.rentbook(b2);
r1.showreader();
}
读者王华(1234)
所借图书:
1:
C语言(100)
2:
数据结构(110)
6.6编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight。
小车类car是它的私有派生类其中包含载人数passenger_load。
卡车类truck是vehicle的私有派生类其中包含载人数passenger_load和载重量payload,每个类都有相关数据的输出方法。
解:
vehicle类是基类由它派生出car类和truck类将公共的属性和方法放在vehicle类中。
本题程序如下:
本程序的执行结果如下:
#include
classvehicle//定义汽车类
{
protected:
intwheels;//车轮数
floatweight;//重量
public:
vehicle(intwheels,floatweight);
intget_wheels();
floatget_weight();
floatwheel_load();
voidshow();
};
classcar:
publicvehicle//定义小车类
{
intpassenger_load;//载人数
public:
car(intwheels,floatweight,intpassengers=4);
intget_passengers();
voidshow();
};
classtruck:
publicvehicle//定义卡车类
{
intpassenger_load;//载人数
floatpayload;//载重量
public:
truck(intwheels,floatweight,intpassengers=2,floatmax_load=24000.00);
intget_passengers();
floatefficiency();
voidshow();
};
vehicle:
:
vehicle(intwheels,floatweight)
{
vehicle:
:
wheels=wheels;
vehicle:
:
weight=weight;
}
intvehicle:
:
get_wheels()
{
returnwheels;
}
floatvehicle:
:
get_weight()
{
returnweight/wheels;
}
voidvehicle:
:
show()
{
cout<<"车轮:
"< cout<<"重量:
"< }
car:
:
car(intwheels,floatweight,
intpassengers):
vehicle(wheels,weight)
{
passenger_load=passengers;
}
intcar:
:
get_passengers()
{
returnpassenger_load;
}
voidcar:
:
show()
{
cout<<"车型:
小车"< vehicle:
:
show();
cout<<"载人:
"< cout< }
truck:
:
truck(intwheels,floatweight,intpassengers,floatmax_load):
vehicle(wheels,weight)
{
passenger_load=passengers;
payload=max_load;
}
inttruck:
:
get_passengers()
{
returnpassenger_load;
}
floattruck:
:
efficiency()
{
returnpayload/(payload+weight);
}
voidtruck:
:
show()
{
cout<<"车型:
卡车"< vehicle:
:
show();
cout<<"载人:
"< cout<<"效率:
"< cout< }
voidmain()
{
carcar1(4,2000,5);
trucktru1(10,8000,3,340000);
cout<<"输出结果"< car1.show();
tru1.show();
}
输出结果
车型:
小车
车轮:
4个
重量:
2000公斤
载人:
5人
车型:
卡车
车轮:
10个
重量:
8000公斤
载人:
3人
效率:
0.977012
6.7设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。
解:
circle类包含私有数据成员radius和求圆面积的成员函数getarea();table类包含私有数据成员height和返回高度的成员函数getheight()。
roundtable类继续所有上述类的数据成员和成员函数,添加了私有数据成员color和相应的成员函数。
本题程序如下:
#include
#include
classcircle
{
doubleradius;
public:
circle(doubler){radius=r;}
doublegetarea(){returnradius*radius*3.14;}
};
classtable
{
doubleheight;
public:
table(doubleh){height=h;}
doublegetheight(){returnheight;}
};
classroundtable:
publictable,publiccircle
{
char*color;
public:
roundtable(doubleh,doubler,charc[]):
circle(r),table(h)
{
color=newchar[strlen(c)+1];
strcpy(color,c);
}
char*getcolor(){returncolor;}
};
voidmain()
{
roundtablert(0.8,1.2,"黑色");
cout<<"圆桌属性数据:
"< cout<<"高度:
"< cout<<"面积:
"< cout<<"颜色:
"< }
本程序的执行结果如下:
圆桌属性数据:
高度:
0.8米
面积:
4.5216平方米
颜色:
黑色
6.8设计一个虚基类base,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关的成员函数。
再由base派生出工程师类engineer,包含职称和专业私有数据成员以及相关的成员函数。
然后由1eda和engineer类派生出主任工程师类chairman。
采用一些数据进行测试。
解:
由于chairman类从leader类和engineer类派生,而leader类和engineer类都是从base类派生的,所以为了使base只存一个副本,必须采用虚拟派生的方法。
本题程序如下:
#include
#include
classbase//基类
{
char*name;//姓名
intage;//年龄
public:
base(){}
voidsetname(charna[])
{
name=newchar[strlen(na)+1];
strcpy(name,na);
}
voidsetage(inta)
{
age=a;
}
char*getname(){returnname;}
intgetage(){returnage;}
};
classleader:
virtualpublicbase//领导类
{
char*job;//职务
char*dep;//部门
public:
leader(){}
voidsetjob(charjb[])
{
job=newchar[strlen(jb)+1];
strcpy(job,jb);
}
voidsetdep(chardp[])
{
dep=newchar[strlen(dp)+1];
strcpy(dep,dp);
}
char*getjob(){returnjob;}
char*getdep(){returndep;}
};
classengineer:
virtualpublicbase//工程师类
{
char*major;//专业
char*prof;//职称
public:
engineer(){}
voidsetmajor(charmaj[])
{
major=newchar[strlen(maj)+1];
strcpy(major,maj);
}
voidsetprof(charpf[])
{
prof=newchar[strlen(pf)+1];
strcpy(prof,pf);
}
char*getmajor(){returnmajor;}
char*getprof(){returnprof;}
};
classchairman:
publicleader,publicengineer//主任工程师类
{};
voidmain()
{
chairmanc;
c.setname("李明");
c.setage(42);
c.setjob("处长");
c.setdep("设计处");
c.setmajor("电站锅炉设计");
c.setprof("高级工程师");
cout<<"输出结果:
"< cout<<""< cout<<""<"< }
本程序的执行结果如下:
输出结果:
李明,年龄42岁,担任设计处处长,
高级工程师,从事电站锅炉设计专业。
三层交换技术交换机与路由器密码恢复交换机的选购路由器设置专题路由故障处理手册数字化校园网解决方案
题1.分析以下程序的执行结果:
#include
classbase
{
intn;
public:
base(){};
base(inta)
{
cout<<"constructingbaseclass"< n=a;
cout<<"n="< }
~base(){cout<<"destructingbaseclass"< };
classsubs:
publicbase
{
intm;
public:
subs(inta,intb):
base(a)
{
cout<<"constructingsubclass"< m=b;
cout<<"m="< }
~subs(){cout<<"destructingsubclass"< };
voidmain()
{
subss(1,2);
}
解:
这里base是基类,subs为派生类,subs类的构造函数中含有调用基本类的构造函数。