第5章继承与派生.docx
《第5章继承与派生.docx》由会员分享,可在线阅读,更多相关《第5章继承与派生.docx(25页珍藏版)》请在冰豆网上搜索。
第5章继承与派生
第5章继承与派生
5.1继承与派生的概念
图5.1
图5.2
图5.3
5.4
图
2
)(C++版数据结构
5.5
图派生类的声明方式5.2派生类的构成5.3
5.6
图派生类成员的访问属性5.45.4.1公用继承
3
面向对象程序设计C++
5.4.2私有继承
图5.7
5.4.3保护成员和保护继承
图5.8
4
)(C++数据结构版
5.4.4多级派生时的访问属性
5.9
图派生类的构造函数和析构函数5.55.5.1简单的派生类的构造函数
5.10
图
5.11
图5.5.2有子对象的派生类的构造函数
5
面向对象程序设计C++
5.12
图5.5.3多层派生时的构造函数
图5.13
5.5.4派生类构造函数的特殊形式5.5.5派生类的析构函数5.6多重继承
5.6.1声明多重继承的方法5.6.2多重继承派生类的构造函数5.6.3多重继承引起的二义性问题
6
)数据结构(C++版
5.14
图
5.15
图
5.16
图
5.17
图
5.18
图
7
C++面向对象程序设计
图5.19
图5.20
5.6.4虚基类1.虚基类的作用
5.21
图
8
)(C++版数据结构
5.22
图
5.23
图
5.24
图2.虚基类的初始化
9
面向对象程序设计C++
5.25
图3.虚基类的简单应用举例
5.7基类与派生类的转换
图5.26
5.27
图
10
)版数据结构(C++
5.8继承与组合
5.9继承在软件开发中的重要意义
习题
1.将例5.1的程序片段补充和改写成一个完整、正确的程序,用公用继承方式。
在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。
2.将例5.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。
在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。
3.将例5.3的程序修改、补充,写成一个完整、正确的程序,用保护继承方式。
在程序中应包括输入数据的函数。
4.修改例5.3的程序,改为用公用继承方式。
上机调试程序,使之能正确运行并得到正确的结果。
对这两种继承方式作比较分析,考虑在什么情况下二者不能互相代替。
5.有以下程序结构,请分析访问属性。
classA//A为基类
{public:
voidf1();
inti;
protected:
voidf2();
intj;
private:
intk;
};
的公用派生类A为//BclassB:
publicA
11
C++面向对象程序设计
{public:
voidf3();
protected:
intm;
private:
intn;
};
classC:
publicB//C为B的公用派生类
{public:
voidf4();
private:
intp;
};
intmain()
{Aa1;//a1是基类A的对象
Bb1;//b1是派生类B的对象
Cc1;//c1是派生类C的对象
return0;
}问:
(1)在main函数中能否用b1.i,b1.j和b1.k引用派生类B对象b1中基类A的成员?
(2)派生类B中的成员函数能否调用基类A中的成员函数f1和f2?
(3)派生类B中的成员函数能否引用基类A中的数据成员i,j,k?
(4)能否在main函数中用c1.i,c1.j,c1.k,c1.m,c1.n,c1.p引用基类A的成员i,j,k,派生?
p的成员C,以及派生类m,n的成员B类
12
)(C++版数据结构
(5)能否在main函数中用c1.f1(),c1.f2(),c1.f3()和c1.f4()调用f1,f2,f3,f4成员函数?
(6)派生类C的成员函数f4能否调用基类A中的成员函数f1,f2和派生类中的成员函数f3?
6.有以下程序结构,请分析所有成员在各类的范围内的访问权限。
classA
{public:
voidf1();
protected:
voidf2();
private:
inti;
};
classB:
publicA
{public:
voidf3();
intk;
private:
intm;
};
classC:
protectedB
{public:
voidf4();
protected:
intm;
private:
13
C++面向对象程序设计
intn;
};
classD:
privateC
{public:
voidf5();
protected:
intp;
private:
intq;
};
intmain()
{Aa1;
Bb1;
Cc1;
Dd1;
7.有以下程序,请完成下面工作:
①阅读程序,写出运行时输出的结果。
②然后上机运行,验证结果是否正确。
③分析程序执行过程,尤其是调用构造函数的过程。
#include
usingnamespacestd;
classA
{public:
A(){a=0;b=0;}
14
)版数据结构(C++
A(inti){a=i;b=0;}
A(inti,intj){a=i;b=j;}
voiddisplay(){cout<<″a=″<private:
inta;
intb;
};
classB:
publicA
{public:
B(){c=0;}
B(inti):
A(i){c=0;}
B(inti,intj):
A(i,j){c=0;}
B(inti,intj,intk):
A(i,j){c=k;}
voiddisplay1()
{display();
cout<<″c=″<}
private:
intc;
};
intmain()
{Bb1;
Bb2
(1);
Bb3(1,3);
15
C++面向对象程序设计
Bb4(1,3,5);
b1.display1();
b2.display1();
b3.display1();
b4.display1();
return0;
8.有以下程序,请完成下面工作:
①阅读程序,写出运行时输出的结果。
②然后上机运行,验证结果是否正确。
③分析程序执行过程,尤其是调用构造函数和析构函数的过程。
#include
usingnamespacestd;
classA
{public:
A(){cout<<″constructingA″<~A(){cout<<″destructingA″<};
classB:
publicA
{public:
B(){cout<<″constructingB″<~B(){cout<<″destructingB″<};
classC:
publicB
{public:
<″constructingC″C(){cout<<
16
)(C++版数据结构
~C(){cout<<″destructingC″<};
intmain()
{Cc1;
return0;
9.分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。
要求:
①在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
②在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。
③对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
④在类体中声明成员函数,在类外定义成员函数。
⑤在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。
10.将本章5.8节中的程序片段加以补充完善,成为一个完整的程序。
在程序中使用继承和组合。
在定义Professor类对象prof1时给出所有数据的初值,然后修改prof1的生日的全部最新数据。
prof1数据,最后输出