#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;
}
解:
所以输出为:
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)