实验四:继承与派生(2)
一、实验目的和要求
(1)理解单继承与多继承,掌握多继承派生类的声明方式。
(2)掌握多继承派生类构造函数的定义的一般形式。
(3)掌握多继承构造函数与析构函数的执行顺序。
(4)掌握含有对象成员的派生类构构造函数的特点。
(5)理解类的继承可能发生的“二义性”问题(同名成员的访问)
二、知识点回顾
多继承构造函数定义的一般形式如下:
派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n) {
// 派生类新增成员的初始化语句
}
class B: public A class D:public A, public B, public C
{ {
B(int i,int j):A( i)
{ ….. D(int i,int j,int k, int l):A( i),B(j ),C( k),ob(l ) } { …….
}
}; };
…….
D obj(1,2,3,4);
多重继承构造函数的执行顺序与单继承下的构造函数执行顺序相同:
(1)先执行基类的构造函数。
(2)再执行对象成员的构造函数。
(3)最后执行派生类的构造函数体。
说明:处于同一层的各个基类的构造函数的执行顺序, 取决于声明派生类时所指定的各个基类的顺序, 与派生类构造函数中所定义的成员初始化列表中的顺序并没有关系.
说明:派生类构造函数后如未列出基类构造函数的调用,默认调用的是无参或带默认参数的构造函数。
三、实验内容
1. P191题4.15输入下列程序,分析程序运行结果........。
理解多重继承(画出类的层次结构图),注意派生类构造函数的定义格式,注意构造函
数的执行顺序,注意同名成员的访问。
#include<iostream>
#include<string>
using namespace std;
class B1{
int b1;
public:
B1(int i)
{b1=i;
cout<<"Construcor B1."<<i<<endl;
}
void print()
{ cout<<b1<<endl;
}
};
class B2{
int b2;
public:
B2(int i)
{b2=i;
cout<<"Construcor B2."<<i<<endl;
}
void print()
{ cout<<b2<<endl;
}
};
class B3{
int b3;
public:
B3(int i)
{b3=i;
cout<<"Construcor B1."<<i<<endl;
}
int getb3()
{ return b3;
}
};
class A:public B2,public B1{
int a;
B3 bb;
public:
A(int i,int j,int k,int l):B1(i),B2(j),bb(k) //此处注意派生类构造函数的定义格式
{a=l;
cout<<"Constructor A."<<l<<endl;
}
void print() //
{ B1::print(); //同名成员的访问,注意消除二义性
B2::print(); //同名成员的访问
cout<<a<<","<<bb.getb3()<<endl;
}
};
int main()
{ A aa(1,2,3,4);
aa.print(); //分析调用的是哪个print(). 同名覆盖(将基类的同名成员隐藏)return 0;
}
在以上程序的基础上,为每个类增加一个析构函数,析构函数体内容“Destructor X”,其中X写成具体的类名。
2.题4.21 设计一个显示小孩出生日期和时间的程序。
已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,同时在Birthtime 类中增加一个数据成员childname用于表示小孩姓名,设计主程序显示一个小孩的出生时间和名字。
程序运行结果:
3. 题
4.22 编写一个学生和教师输入和显示程序。
学生数据有:编号no 、姓名name 、班号 c 、成绩 score
教师数据有:编号no 、姓名name 、职称title 、部门depart
要求将编号、姓名的输入和显示设计成一个类Person,并作为学生类Student 和Teacher 类的基类。
(从一个基类派生出多个派生类)
person
选择练习:题4.14 派生类构造函数调用基类构造函数(基类构造函数重载)
三、实验结果
四、总结。