继承与多态性

上传人:ji****72 文档编号:54127879 上传时间:2018-09-08 格式:PPT 页数:59 大小:687KB
返回 下载 相关 举报
继承与多态性_第1页
第1页 / 共59页
继承与多态性_第2页
第2页 / 共59页
继承与多态性_第3页
第3页 / 共59页
继承与多态性_第4页
第4页 / 共59页
继承与多态性_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《继承与多态性》由会员分享,可在线阅读,更多相关《继承与多态性(59页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计语言 第 8 章 继承与多态性,学好程序设计的根本方法是 程序!,写,第8章 继承与多态性 8.1 继承与派生 8.2 冲突 8.3 虚函数与多态性 8.4 习题 实验 课堂练习,8.1 继承与派生,继承性是通过扩展类,实现代码复用,以减少冗余代码。多态性则是通过虚函数,实现接口复用。8.1.1 派生类 1派生类概念 将类teacher和类student中的重复属性抽出来作为基类people;在类people的基础上,加上成员wage构成教师类teacher,加上成员score构成学生类student。,教师类: class teacher char name10; /姓名 int

2、 year,month,day; /生日 float wage; /工资 ;,学生类: class teacher char name10; /姓名 int year,month,day; /生日 float score; /成绩 ;,8.1.1 派生类,继承机制是以已有的类为基础,定义新类。已有的类称为基类或父类,新定义的类称为派生类或子类。,基 类 (父类),派生类 (子类),student,原有属性: name year,month,day float wage,teacher,people,增加属性: wage,增加属性: score,8.1.1 派生类,2定义派生类 定义 类的基本格

3、式为: class 类名 成员列表 ; (1)派生方式的关键字与类中成员的访问权限相同,public、private和protected方式的派生分别称为公有派生、私有派生和保护派生。 (2)缺省派生方式为私有派生。 (3)类体中新增成员与基本类中成员的定义方法相同。,派生,:派生方式 基类名,新增,派生,8.1.1 派生类,例8-1 定义类people,包含数据成员姓名、出生日期;定义教师类teacher,包含数据成员姓名、出生日期、工资和工作部门。程序设计 以类people为其类,派生出类teacher。 类people中包含公同成员姓名和出生日期 。 类teacher类体中增加 基类中没

4、有的成员 工资和工作部门。源程序代码 class people char name10; /姓名 int year,month,day; /生日 ;,class teacher:public people float wage; /工资 public: char department20; /部门 ;,: 派生方式 基类,8.1.2 派生成员及其访问权限,1. 派生类中的成员 派生类中的成员包括: (1)派生成员从基类继承来的成员; (2)新增成员派生类类体中列出的成员。 派生类除了从基类继承数据成员外,还继承除构造函数和析构函数以外的其他函数成员。,访问权限由派生类定义时成员属性的关键字说明

5、,访问权限?,8.1.2 派生成员及其访问权限,2. 派生成员的访问权限 由其在基类中的原有属性和派生方式共同决定。具体为: (1)公有派生时,保持基类中的原有属性不变。 (2)私有派生时,均变为私有成员。 (3)保护派生时,基类中的原有公有和保护成员,变为保护成员,原有私有成员仍为私有成员。,公有派生时派生成员访问权限,8.1.2 派生成员及其访问权限,私有派生时派生成员访问权限,直接访问是指直接使用成员; 间接访问是指通过公有成员函数间接使用成员。 class A int a; public: int get()return a; ;,访问成员a,8.1.2 派生成员及其访问权限,保护派生

6、时派生成员访问权限,在派生类内部能否访问派生成员,由派生成员在基类中的原有属性决定,与派生后的属性无关,即派生类内部可直接访问基类原有的非私有成员,间接访问私有成员; 在派生类外部能否访问派生成员,则要看派生后的属性,即派生后仍为公有的可直接访问,而非公有的只能间接访问。,8.1.2 派生成员及其访问权限,例8-2 编程实现公有派生时对派生成员的访问。 程序设计 定义基类Base三种不同访问属性的成员x(公有)、y(私有)和z(保护)。 在类Base的派生类Derived中,直接使用x和z,间接使用y。 在主函数中(派生类外部),直接使用x,间接使用y和z。,源程序代码 #include cl

7、ass Base int y; protected: int z; public: int x; Base() x=1; y=2; z=3; int gety() return y; int getz() return z; ;,8.1.2 派生成员及其访问权限,class Derived:public Base /A public: void print() coutxtgety()tzn; ; void main() Derived test; test.print(); couttest.xttest.gety()ttest.getz()n; 若为私有派生或保护派生,即把A行的publi

8、c改为private或protected,编译时会在何处出现什么错误?,8.1.3 派生类构造函数,派生成员初始化在派生类的头部通过调用基类的构造函数完成,而新增成员在函数体中完成。 1. 派生类构造函数定义 类体中,定义派生类构造函数的基本格式为: 派生类名(形参列表): 基类名(实参列表) 新增成员初始化 派生类名即派生类构造函数名称,其后的形参包含类型和名称; 基类名即基类构造函数名,其后的实参只有名称,没有类型; 类体中新增成员初始化的方法与普通类相同。,调用基类构造函数,初始化派生成员,8.1.3 派生类构造函数,派生类构造函数也可以在类中说明,类外定义,其格式为: (1)类中说明

9、派生类名(形参列表); (2)类外定义 派生类名:派生类名(形参列表): 基类名(实参列表) 新增成员初始化 基类构造函数调用只能在定义时列出,不能在说明时列出。 例8-3 定义派生类的构造函数,初始化数据成员。程序设计 定义基类Base,包含数据成员b1、b2。 定义类Base的派生类Derived,新增数据成员d1、d2。 派生类构造函数具有4个形参,分别用于对派生成员b1、b2和新增成员d1、d2初始化;头部通过Base(a,b)调用基类构造函数对b1、b2初始化,函数体中对d1、d2初始化。,8.1.3 派生类构造函数,源程序代码 #include class Base int b1,

10、b2; public: void show() cout“b1=“b1“,b2=“b2n; Base(int x,int y) b1=x; b2=y; ; class Derived:public Base int d1,d2; public: Derived (int a,int b,int c,int d): Base(a,b) d1=c; d2=d; void print(); ;,void Derived:print() cout “派生成员:“; show(); cout “新增成员:“; cout“d1=“d1“,d2=“d2n; ,void main() Derived test

11、(1,2,3,4); test.print(); ,1 2,3 4,程序输出为: 派生成员:b1=1,b2=2 新增成员:d1=3,d2=4,8.1.3 派生类构造函数,派生类的构造函数中必须包括基类构造函数的调用。派生类构造函数头部未列出基类构造函数调用时,并不是不调用基类的构造函数,而是调用基类缺省的构造函数。如: class A public: A(int x) coutxn; ; class B public: B(int x=0) coutxn; ;,class C:public A public: C (int x) coutxn; ;,class D:public B publi

12、c: D(int x) coutxn; ;,类C定义错误,其构造函数不能调用其基类A的构造函数;类D定义正确,产生类D对象时,调用类B缺省的构造函数。,8.1.3 派生类构造函数,2. 对象成员的初始化 当类中的数据成员是其他类的对象时,称该数据成员为对象成员。其初始化的方法与派生成员相似,都是调用其所属类的构造函数完成的;所不同的是:派生成员的初始化是通过基类名调用的,而对象成员初始化是通过对象名调用的。如: class A int a,b; public: A(int x, int y) a=x; b=y; ; class B A obj; public: B(int x,int y):o

13、bj(x,y) ;,以对象名obj调用其所属类A的构造函数,初始化obj.a和obj.b,8.1.3 派生类构造函数,例8-4 含对象成员的派生类的构造函数。程序设计 定义类A,构造函数中增加字符串输出语句,作用调用标记。 类B作为类C的基类,类C中包含类A的对象obj。 在主函数中定义类C的对象,观察构造函数的调用过程和结果。,8.1.3 派生类构造函数,class A int a; public: A(int x)a=x; cout“调用类A构造函数n“; void show() coutan; ; class B protected: int b; public: B(int x)b=x; cout“调用类B构造函数n“; ; class C:public B int c; A obj; public: C(int x,int y,int z):obj(y),B(z) c=x; cout“调用类C构造函数n“; void print() ; ;,void main() C test(10,20,30); test.print(); ,10,30,20,程序输出为: 调用类B构造函数调用类A构造函数调用类C构造函数对象成员:20 派生成员:30 普通成员:10,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号