第5章 继承与派生.docx

上传人:b****4 文档编号:5120448 上传时间:2022-12-13 格式:DOCX 页数:12 大小:262.98KB
下载 相关 举报
第5章 继承与派生.docx_第1页
第1页 / 共12页
第5章 继承与派生.docx_第2页
第2页 / 共12页
第5章 继承与派生.docx_第3页
第3页 / 共12页
第5章 继承与派生.docx_第4页
第4页 / 共12页
第5章 继承与派生.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

第5章 继承与派生.docx

《第5章 继承与派生.docx》由会员分享,可在线阅读,更多相关《第5章 继承与派生.docx(12页珍藏版)》请在冰豆网上搜索。

第5章 继承与派生.docx

第5章继承与派生

第5章继承与派生

5.1继承与派生的概念

图5.1

图5.2

图5.3

图5.4

图5.5

5.2派生类的声明方式

5.3派生类的构成

图5.6

5.4派生类成员的访问属性

5.4.1公用继承

5.4.2私有继承

图5.7

5.4.3保护成员和保护继承

图5.8

5.4.4多级派生时的访问属性

图5.9

5.5派生类的构造函数和析构函数

5.5.1简单的派生类的构造函数

图5.10

图5.11

5.5.2有子对象的派生类的构造函数

图5.12

5.5.3多层派生时的构造函数

图5.13

5.5.4派生类构造函数的特殊形式

5.5.5派生类的析构函数

5.6多重继承

5.6.1声明多重继承的方法

5.6.2多重继承派生类的构造函数

5.6.3多重继承引起的二义性问题

图5.14

图5.15

图5.16

图5.17

图5.18

图5.19

图5.20

5.6.4虚基类

1.虚基类的作用

图5.21

图5.22

图5.23

图5.24

2.虚基类的初始化

图5.25

3.虚基类的简单应用举例

5.7基类与派生类的转换

图5.26

图5.27

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;

};

classB:

publicA//B为A的公用派生类

{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,派生类B的成员m,n,以及派生类C的成员p?

(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:

intn;

};

classD:

privateC

{public:

voidf5();

protected:

intp;

private:

intq;

};

intmain()

{Aa1;

Bb1;

Cc1;

Dd1;

7.有以下程序,请完成下面工作:

①阅读程序,写出运行时输出的结果。

②然后上机运行,验证结果是否正确。

③分析程序执行过程,尤其是调用构造函数的过程。

#include

usingnamespacestd;

classA

{public:

A(){a=0;b=0;}

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);

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:

C(){cout<<″constructingC″<

~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的全部最新数据。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1