程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++習題與解析-繼承和派生

C++習題與解析-繼承和派生

編輯:C++入門知識

  6.1 分析以下程序的執行結果
  #include<iostream.h>
  class base
  {
  public:
  base(){cout<<"constrUCting base class"<<endl;}
  ~base(){cout<<"destructing base class"<<endl; }
  };
  class subs:public base
  {
  public:
  subs(){cout<<"constructing sub class"<<endl;}
  ~subs(){cout<<"destructing sub class"<<endl;}
  };
  void main()
  {
  subs s;
  }
  解:
  本題說明單繼續情況下構造函數和析構函數的調用順序。這裡base為基類,subs為派生類。
  所以輸出為:
  constructing base class
  constructing sub class
  destructing sub class
  destrcuting base class
  注重:在單繼續情況下,首先調用基類的構造函數 ,隨後調用派生類的構造函數,析構函數的調用順序則正好相反。
  
  ---------------------------------------------------
  
  6.2 分析以下程序的執行結果:
  #include<iostream.h>
  class base
  {
  int n;
  public:
  base(int a)
  {
  cout<<"constructing base class"<<endl;
  n=a;
  cout<<"n="<<n<<endl;
  }
  ~base(){cout<<"destructing base class"<<endl;}
  };
  class subs:public base
  {
  base bobj;
  int m;
  public:
  subs(int a,int b,int c):base(a),bobj(c)
  {
  cout<<"constructing sub cass"<<endl;
  m=b;
  cout<<"m="<<m<<endl;
  }
  ~subs(){cout<<"destructing sub class"<<endl;}
  };
  void main()
  {
  subs s(1,2,3);
  }
  解:
  本題說明 派生類中含有對象成員情況下構造函數和析構函數的調用順序。這裡base為基類,subs為派生類,subs類的構造函數中含有對象成員。
  所以輸出為:
  constrcuting base class
  n=1
  constructing base class
  n=3
  constructing sub class
  m=2
  destructing sub class
  destructing base class
  destructing base class
  注重:當派生類中含有對象成員時,構造函數的調用順序如下:
  1)基類的構造函數
  2)對象成員的構造函數
  3)派生類的構造函數
  
  析構函數的調用順序與之相反
  
  -------------------------------------------------
  
  6.3 分析以下程序的執行結果
  #include<iostream.h>
  class A
  {
  public:
  int n;
  };
  class B:public A{};
  class C:public A{};
  class D:public B,public C
  {
  int getn(){return B::n;}
  };
  void main()
  {
  D d;
  d.B::n=10;
  d.C::n=20;
  cout<<d.B::n<<","<<d.C::n<<endl;
  }
  解:
  D類是從類和類派生的而類和類又都是從類派生的,但各有自己的副本。所以對於對象d,d.B::n與d.C::n是兩個不同的數據成員它們互無聯系。
  所以輸出為:
  10,20 -------------------------------------------- 6.4 分析以下程序的執行結果
  #include<iostream.h>
  class A
  {
  public:
  int n;
  };
  class B:virtual public A{};
  class C:virtual public A{};
  class D:public B,public C
  {
  int getn(){return B::n;}
  };
  void main()
  {
  D d;
  d.B::n=10;
  d.C::n=20;
  cout<<d.B::n<<","<<d.C::n<<endl;
  }
  解:
  D類是從類和類派生的而類和類又都是從類派生,但這是虛繼續關系即是虛基類因此和共用一個的副本所以對於對象d,d.B::n與d.C::n是一個成員。
  所以輸出為:
  20,20
   --------------------------------------- 6.5 假設圖書館的圖書包含書名、編號作者屬性讀者飲包含姓名和借書證屬性每位讀者最多可借5本書,編寫程序列出某讀者的借書情況。
  解:
  設計一個類,從它派生出胃病書類book和讀者類reader,在reader類中有一個rentbook()成員函數用於借閱圖書。
  程序代碼如下:
  本程序的執行結果如下:
  #include<iostream.h>
  #include<string.h>
  class object
  {
  char name[20];
  int no;
  public:
  object(){}
  object(char na[],int n)
  {
  strcpy(name,na);no=n;
  }
  void show()
  {
  cout<<name<<"("<<no<<")";
  }
  };
  class book:public object
  {
  char author[10];
  public:
  book(){}
  book(char na[],int n,char auth[]):object(na,n)
  {
  strcpy(author,auth);
  }
  void showbook()
  {
  show();
  cout<<"作者:"<<author;
  }
  };
  class reader:public object
  {
  book rent[5];
  int top;
  public:
  reader(char na[],int n):object(na,n){top=0;}
  void rentbook(book &b)
  {
  rent[top]=b;
  top++;
  }
  void showreader()
  {
  cout<<"讀者:";show();
  cout<<endl<<"所借圖書:"<<endl;
  for(int i=0;i<top;i++)
  {
  cout<<" "<<i+1<<":"; // 5個空格
  rent[i].show();
  cout<<endl;
  }
  }
  };
  void main()
  {
  book b1("C語言",100,"譚浩強"),b2("數據結構",110,"嚴蔚敏");
  reader r1("王華",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<iostream.h>
  class vehicle // 定義汽車類
  {
  protected:
  int wheels; // 車輪數
  float weight; // 重量
  public:
  vehicle(int wheels,float weight);
  int get_wheels();
  float get_weight();
  float wheel_load();
  void show();
  };
  class car:public vehicle // 定義小車類
  {
  int passenger_load; // 載人數
  public:
  car(int wheels,float weight,int passengers=4);
  int get_passengers();
  void show();
  };
  class truck:public vehicle // 定義卡車類
  {
  int passenger_load; // 載人數
  float payload; // 載重量
  public:
  truck(int wheels,float weight,int passengers=2,float max_load=24000.00);
  int get_passengers();
  float efficiency();
  void show();
  };
  vehicle::vehicle(int wheels,float weight)
  {
  vehicle::wheels=wheels;
  vehicle::weight=weight;
  }
  int vehicle::get_wheels()
  {
  return wheels;
  }
  float vehicle::get_weight()
  {
  return weight/wheels;
  }
  void vehicle::show()
  {
  cout << "車輪:" << wheels << "個" << endl;
  cout << "重量:" << weight << "公斤" << endl;
  }
  car::car(int wheels, float weight,
  int passengers) :vehicle (wheels, weight)
  {
  passenger_load=passengers;
  }
  int car::get_passengers ()
  {
  return passenger_load;
  }
  void car::show()
  {
  cout <<" 車型:小車" << endl;
  vehicle::show();
  cout << "載人:" << passenger_load << "人" << endl;
  cout << endl;
  }
  truck:: truck(int wheels, float weight,int passengers, float max_load):vehicle(wheels,weight)
  {
  passenger_load=passengers;
  payload=max_load;
  }
  int truck::get_passengers()
  {
  return passenger_load;
  }
  float truck::efficiency()
  {
  return payload/(payload+weight);
  }
  void truck::show()
  {
  cout <<"車型:卡車" << endl;
  vehicle:: show ();
  cout << "載人:" << passenger_load << "人" << endl;
  cout << "效率:" << efficiency() << endl;
  cout << endl;
  }
  void main ()
  {
  car car1(4,2000,5);
  truck tru1(10,8000,3,340000);
  cout << "輸出結果" << endl;
  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<iostream.h>
  #include<string.h>
  class circle
  {
  double radius;
  public:
  circle(double r) { radius=r; }
  double getarea() { return radius*radius*3.14; }
  };
  class table
  {
  double height;
  public:
  table(double h) { height=h; }
  double getheight() { return height; }
  };
  class roundtable : public table,public circle
  {
  char *color;
  public:
  roundtable(double h, double r, char c[]) : circle (r) , table (h)
  {
  color=new char[strlen(c)+1];
  strcpy (color, c);
  }
  char *getcolor() { return color; }
  };
  void main()
  {
  roundtable rt(0.8,1.2,"黑色");
  cout << "圓桌屬性數據:" << endl;
  cout << "高度:" <<rt.getheight() << "米" << endl;
  cout << "面積:" <<rt.getarea() << "平方米" << endl;
  cout << "顏色:" <<rt.getcolor() << endl;
  }
  本程序的執行結果如下:
  圓桌屬性數據:
  高度:0.8米
  面積:4.5216平方米
  顏色:黑色
  
  -------------------------------------------------------
  
  6.8 設計一個虛基類base,包含姓名和年齡私有數據成員以及相關的成員函數,由它派生出領導類leader,包含職務和部門私有數據成員以及相關的成員函數。再由base派 生出工程師類engineer,包含職稱和專業私有數據成員以及相關的成員函數。然後由1eda和engineer類派生出主任工程師類chairman。采用一些數據進行測試。
  解:
  由於chairman類從leader類和engineer類派生,而leader類和engineer類都是從base類派生的,所以為了使base只存一個副本,必須采用虛擬派生的方法。
  本題程序如下:
  #include<iostream.h>
  #include<string.h>
  class base // 基類
  {
  char* name;// 姓名
  int age; // 年齡
  public:
  base(){}
  void setname(char na[])
  {
  name=new char[strlen(na)+1];
  strcpy(name,na);
  }
  void setage(int a)
  {
  age=a;
  }
  char* getname() { return name; }
  int getage() { return age; }
  };
  class leader:virtual public base // 領導類
  {
  char *job;//職務
  char *dep;//部門
  public:
  leader() { }
  void setjob(char jb[])
  {
  job=new char[strlen(jb)+1];
  strcpy (job, jb);
  }
  void setdep(char dp[])
  {
  dep=new char [strlen (dp) +1] ;
  strcpy (dep, dp);
  }
  char *getjob() { return job; }
  char *getdep() { return dep; }
  };
  class engineer:virtual public base // 工程師類
  {
  char *major; // 專業
  char *prof; // 職稱
  public:
  engineer () { }
  void setmajor(char maj [])
  {
  major=new char[strlen(maj)+1];
  strcpy (major,maj);
  }
  void setprof(char pf[])
  {
  prof=new char[strlen(pf)+1];
  strcpy (prof, pf);
  }
  char*getmajor() {return major; }
  char*getprof() {return prof; }
  } ;
  class chairman:public leader,public engineer // 主任工程師類
  { } ;
  void main()
  {
  chairman c;
  c.setname("李明");
  c.setage(42);
  c.setjob("處長");
  c.setdep("設計處");
  c.setmajor("電站鍋爐設計");
  c.setprof("高級工程師");
  cout<< "輸出結果:"<<endl;
  cout << " " << c.getname() << ",年齡" << c.getage()<<"歲,擔任" <<c.getdep() <<c.getjob() <<","<<endl;
  cout << " " << c.getprof() << ",從事" << c.getmajor()<< "專業" << "。 " << endl;
  }
  
  本程序的執行結果如下:
  輸出結果:
  李明,年齡42歲,擔任設計處處長,
  高級工程師,從事電站鍋爐設計專業。 三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案
   題 1. 分析以下程序的執行結果:
  #include<iostream.h>
  class base
  {
  int n;
  public:
  base(){};
  base (int a)
  {
  cout << "constructing base class" << endl;
  n=a;
  cout << "n=" << n << endl;
  }
  ~base() { cout << "destructing base class" << endl; }
  };
  class subs : public base
  {
  int m;
  public:
  subs(int a, int b) : base(a)
  {
  cout << "constructing sub class" << endl;
  m=b;
  cout << "m=" << m << endl;
  }
  subs() { cout << "destructing sub class" << endl; }
  };
  void main ()
  {
  subs s(1,2);
  }
  
  解:
  這裡base 是基類,subs為派生類,subs類的構造函數中含有調用基本類的構造函數。
  所以輸出為:
  constructing base class
  n=1
  constructing sub class
  n=2
  destructing base class
  destructing sub class
  
  -----------------------------------------------------
  
  題 2.分析以下程序的執行結果:
  #include <iostream.h>
  class Sample
  {
  protected:
  int x;
  public:
  Sample() { x=0; }
  Sample(int val) { x=val; }
  void operator++() { x++; }
  };
  class Derived:public Sample
  {
  int y;
  public:
  Derived():Sample(){ y=0; }
  Derived(int val1,int val2):Sample(val1){ y=val2; }
  void operator--(){ x--;y--;}
  void disp()
  {
  cout<<"x="<< x <<" y=" << y << endl; f
  }
  };
  void main ()
  {
  Derived d(3,5);
  d.disp();
  d++;
  d.disp ();
  d--;
  d--;
  d.disp();
  }
  
  解:
  所有運算都是對x而言的。
  所以輸出為:
  x=3, y=5
  x=4,y=5
  x=2,y=5
  
  --------------------------------------------------------------
  
  題 3 分析以下程序的執行結果:
  #include <iostream.h>
  class A
  {
  int a;
  public:
  A(int i) { a=i;cout << "constructing class A" << endl; }
  void print() { cout << a << endl; }
  ~A() { cout << "destructing class A" << endl; }
  };
  class Bi:public A
  {
  int bl;
  public:
  Bl(int i,int j):A(i)
  {
  bl=j;cout << "constructing class BI" << endl;
  void print()
  {
  A::print ();
  cout << bl << endl;
  }
  ~BI(){ cout << "destructing class BI" << endl; }
  };
  class B2:public A
  {
  int b2;
  public:
  B2(int i,int j):A(i);
  {
  b2=j;cout << "constructing class B2" << endl;
  }
  void print()
  {
  A::print ();
  cout << b2 << endl;
  }
  ~B2() { cout << "destructing class B2" << endl; }
  };
  class C:public B1,public B2
  {
  int c;
  public:
  C(int i,int j,int k, int 1,int m) :Bl(i,j),B2(k,1),c(m)
  {
  cout << "constructing class C" << endl;
  }
  void print()
  {
  Bl::print();
  B2::print();
  cout << c << endl;
  }
  ~C( ){ cout << "destructing class C" << endl; }
  };
  void main()
  {
  C c1(1,2,3,4,5);
  cl.print();
  }
  
  解:
  C類是從B1類和B2類派生的,而B1和B2類又都是從A類派生,但各有自己的副本,所有這些成員函數均有print()成員函數。所以,在C的成員函數實現中,調用print()時,要加上類作用域運算符“::”。
  所以輸出為:
  constructing class A
  constructing class B1
  constructing class A
  constructing class B2
  constructing class C
  1
  2
  3
  4
  5
  destructing class C
  destructing class B2
  destructing class A
  destructing class B1
  destructing class A
  
  -------------------------------------------------------
  
  題 4 分析以下程序執行結果:
  #include <iostream.h>
  class A
  {
  public:
  A(char *s) { cout << s << endl; }
  ~A() {}
  };
  class B:public A
  {
  public:
  B(char *sl,char *s2) :A(sl)
  {
  cout << s2 << endl;
  }
  };
  class C:public A
  {
  public:
  C(char *sl,char *s2) :A(sl)
  {
  cout << s2 << endl;
  }
  };
  class D:public B,public C
  {
  public:
  D(char *sl,char *s2,char *s3,char *s4) :B(sl,s2),C(sl,s3)
  {
  cout << s4 << endl;
  }
  void main ()
  {
  D d("class A","class B","class C","class D");
  }
  
  解:
  D類是從B和C類派生的,而B和C類又都是從A類派生,但各有自己的副本。
  所以輸出為:
  class A
  class B
  class A
  class C
  class D
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved