实验五 派生和继承
【实验目的】
1.理解类的继承的概念,能够定义和使用类的继承关系。
2.掌握派生类的声明与定义方法。
3.熟悉公有派生、保护派生和私有派生的访问特性。
4.理解虚基类在解决二义性问题中的作用。
【实验内容】
1.仔细阅读下列程序,写出运行结果。
#include <iostream.h>
class A{
public:
A(int m){ cout<<"A constructor:"<<m<<endl; } ~A(){ cout<<"A destructor"<<endl; }
};
class B{
public:
B(int n){ cout<<"B constructor:"<<n<<endl;}
B(){cout<<"B destructor"<<endl;}
};
class C: public B,public A{
public:
C(int a,int b,int c,int d,int e):A(b),B(e),bb(c),aa(d) { cout<<"C constructor:"<<a<<endl; }
~C(){ cout<<"C destructor"<<endl; } private:
A aa;
B bb;
};
int main() {
C cc(1,2,3,4,5);
}
2.定义 Person 类,数据成员包含姓名变量 name,以及输出姓名的成员函数 PrintName()。
再从 Person 类派生出 Worker 类,该类包括数据成员 number 用来记录对象的工号、sex 用来记 录对象的性别、age 用来记录对象的年龄、add 用来记录对象的家庭住址;包括函数成员
printinfo()用来输出对象的个人信息。
要求:
(1)构造 Worker 类对象输出该对象的工号、年龄、家庭住址等信息。
(2)在 Worker 类的 printinfo()成员函数中须调用 Person 类的成员函数 PrintName()。
3.定义基类 myarray 来存放一组整数,基类中有构造函数、析构函数、输入数据和输出 数据的成员函数。
4.定义类 sortarray 继承自 myarray,在该类中定义成员函数实现排序功能。
5.定义类 rearray 继承自 myarray,在该类中定义成员函数实现逆转功能。
6.定义类 averarray 继承自 myarray,在该类中定义成员函数求解数组中的所有整数的平 均值。
7.定义 newarray 类,同时继承自 sortarray、rearray 和 averarray,使得 newarray 类的对象 同时具有排序、逆转和求平均值的功能。在继承 myarray 的过程中声明为虚基类,体会虚基类 在解决二义性问题中的作用。
【实验指导】
1.分析:注意派生类和基类中构造函数和析构函数的调用顺序。
程序运行结果如下:
B constructor:5 A constructor:2 A constructor:4 B constructor:3 C constructor:1 C destructor B destructor A destructor A destructor B destructor 2.参考程序为:
#include <iostream.h>
class Person{
public:
Person(char * n ){ name = n; } void PrintName(){ cout<<name<<' '; } private:
char * name;
};
class Worker:public Person{
public:
Worker(char * n,int nu,char * s,int ag,char *add):Person(n) { num = nu; sex = s; age = ag; address = add;}
void PrintInfo() {
PrintName();
cout<<num<<' '<<sex<<' '<<age<<' '<<address<<' '<<endl;
} private:
int num;
char * sex;
int age;
char * address;
};
int main() {
Worker b("张三",10168,"男",28,"中山路 128 号");
b.PrintInfo();
return 0;
}
3.参考程序为:
#include <iostream.h>
class myarray{
public:
myarray(int leng);
~myarray();
void input();
void display();
protected:
int *alist; //指向动态申请的一组空间
int length; //数组中元素的个数 };
myarray::myarray(int leng) {
alist=new int[leng];
length=leng;
}
myarray::~myarray() {
delete [] alist;
}
void myarray::input() {
cout<<"enter numbers:"<<endl;
int i;
int *p=alist;
for (i=0;i<length;i++) cin>>p[i];
}
void myarray::display() {
int i;
int *p=alist;
for (i=0;i<length;i++) cout<<p[i]<<" ";
cout<<endl;
}
void main() {
myarray a(5);
a.input();
a.display();
}
4.参考程序为:
#include <iostream.h>
class myarray{
public:
myarray(int leng);
~myarray();
void input();
void display();
protected:
int *alist;
int length;
};
myarray::myarray(int leng) {
alist=new int[leng];
length=leng;
}
myarray::~myarray() {
delete [] alist;
}
void myarray::input() {
cout<<"enter numbers:"<<endl;
int i;
int *p=alist;
for (i=0;i<length;i++) cin>>p[i];
}
void myarray::display() {
int i;
int *p=alist;
for (i=0;i<length;i++) cout<<p[i]<<" ";
cout<<endl;
}
class sortarray:public myarray{
public:
sortarray(int length):myarray(length){}
void sort();
};
void sortarray::sort() {
int i,j,temp;
for (i=0;i<length-1;i++) for (j=0;j<length-i-1;j++) if(alist[j]>alist[j+1]) {
temp=alist[j];
alist[j]=alist[j+1];
alist[j+1]=temp;
} }
void main() {
sortarray s(5);
s.input();
s.display();
s.sort();
s.display();
}
5.参考程序为:
#include <iostream.h>
class myarray{
public:
myarray(int leng);
~myarray();
void input();
void display();
protected:
int *alist;
int length;
};
myarray::myarray(int leng) {
alist=new int[leng];
length=leng;
}
myarray::~myarray() {
delete [] alist;
}
void myarray::input() {
cout<<"enter numbers:"<<endl;
int i;
int *p=alist;
for (i=0;i<length;i++) cin>>p[i];
}
void myarray::display() {
int i;
int *p=alist;
for (i=0;i<length;i++) cout<<p[i]<<" ";
cout<<endl;
}
class rearray:public myarray{
public:
rearray(int leng):myarray(leng) {}
void reverse();
};
void rearray::reverse() {
int i,temp;
for(i=0;i<length/2;i++) {
temp=alist[i];
alist[i]=alist[length-1-i];
alist[length-1-i]=temp;
} }
void main() {
rearray r(5);
r.input();
r.display();
r.reverse();
r.display();
}
6.参考程序为:
#include <iostream.h>
class myarray{
public:
myarray(int leng);
~myarray();
void input();
void display();
protected:
int *alist;
int length;
};
myarray::myarray(int leng) {
alist=new int[leng];
length=leng;
}
myarray::~myarray() {
delete [] alist;
}
void myarray::input() {
cout<<"enter numbers:"<<endl;
int i;
int *p=alist;
for (i=0;i<length;i++) cin>>p[i];
}
void myarray::display() {
int i;
int *p=alist;
for (i=0;i<length;i++) cout<<p[i]<<" ";
cout<<endl;
}
class averarray:public myarray{
public:
averarray(int leng):myarray(leng) {}
double aver();
};
double averarray::aver() {
int i,j;
double s=0;
for (i=0;i<length;i++) s=s+alist[i];
return s/length;
}
void main() {
averarray a(5);
a.input();
a.display();
cout<<"the aver is:"<<a.aver()<<endl;
}
7.参考程序为:
#include <iostream.h>
class myarray{
public:
myarray(int leng);
~myarray();
void input();
void display();
protected:
int *alist;
int length;
};
myarray::myarray(int leng) {
alist=new int[leng];
length=leng;
}
myarray::~myarray() {
delete [] alist;
}
void myarray::input() {
cout<<"enter numbers:"<<endl;
int i;
int *p=alist;
for (i=0;i<length;i++) cin>>p[i];
}
void myarray::display() {
int i;
int *p=alist;
for (i=0;i<length;i++) cout<<p[i]<<" ";
cout<<endl;
}
class averarray:virtual public myarray{
public:
averarray(int leng):myarray(leng) {}
double aver();
};
double averarray::aver() {
int i,j;
double s=0;
for (i=0;i<length;i++) s=s+alist[i];
return s/length;
}
class sortarray:virtual public myarray{
public:
sortarray(int length):myarray(length){}
void sort();
};
void sortarray::sort() {
int i,j,temp;
for (i=0;i<length-1;i++) for (j=0;j<length-i-1;j++) if(alist[j]>alist[j+1]) {
temp=alist[j];
alist[j]=alist[j+1];
alist[j+1]=temp;
} }
class rearray:virtual public myarray{
public:
rearray(int leng):myarray(leng) {}
void reverse();
};
void rearray::reverse() {
int i,temp;
for(i=0;i<length/2;i++) {
temp=alist[i];
alist[i]=alist[length-1-i];
alist[length-1-i]=temp;
} }
class newarray:public sortarray,public rearray,public averarray{
public:
newarray(int leng):myarray(leng),sortarray(leng),rearray(leng),averarray(leng) {}
};
void main() {
newarray n(5);
n.input();
n.display();
cout<<"the aver is:"<<n.aver()<<endl;
n.sort();
n.display();
n.reverse();
n.display();
}