C习题与解析继承和派生讲解.docx

上传人:b****1 文档编号:2870214 上传时间:2023-05-04 格式:DOCX 页数:26 大小:20.19KB
下载 相关 举报
C习题与解析继承和派生讲解.docx_第1页
第1页 / 共26页
C习题与解析继承和派生讲解.docx_第2页
第2页 / 共26页
C习题与解析继承和派生讲解.docx_第3页
第3页 / 共26页
C习题与解析继承和派生讲解.docx_第4页
第4页 / 共26页
C习题与解析继承和派生讲解.docx_第5页
第5页 / 共26页
C习题与解析继承和派生讲解.docx_第6页
第6页 / 共26页
C习题与解析继承和派生讲解.docx_第7页
第7页 / 共26页
C习题与解析继承和派生讲解.docx_第8页
第8页 / 共26页
C习题与解析继承和派生讲解.docx_第9页
第9页 / 共26页
C习题与解析继承和派生讲解.docx_第10页
第10页 / 共26页
C习题与解析继承和派生讲解.docx_第11页
第11页 / 共26页
C习题与解析继承和派生讲解.docx_第12页
第12页 / 共26页
C习题与解析继承和派生讲解.docx_第13页
第13页 / 共26页
C习题与解析继承和派生讲解.docx_第14页
第14页 / 共26页
C习题与解析继承和派生讲解.docx_第15页
第15页 / 共26页
C习题与解析继承和派生讲解.docx_第16页
第16页 / 共26页
C习题与解析继承和派生讲解.docx_第17页
第17页 / 共26页
C习题与解析继承和派生讲解.docx_第18页
第18页 / 共26页
C习题与解析继承和派生讲解.docx_第19页
第19页 / 共26页
C习题与解析继承和派生讲解.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C习题与解析继承和派生讲解.docx

《C习题与解析继承和派生讲解.docx》由会员分享,可在线阅读,更多相关《C习题与解析继承和派生讲解.docx(26页珍藏版)》请在冰点文库上搜索。

C习题与解析继承和派生讲解.docx

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类的构造函数中含有调用基本类的构造函数。

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2