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