清华c+语言程序设计:第14章 继承

上传人:tia****nde 文档编号:70832691 上传时间:2019-01-18 格式:PPT 页数:63 大小:533.81KB
返回 下载 相关 举报
清华c+语言程序设计:第14章 继承_第1页
第1页 / 共63页
清华c+语言程序设计:第14章 继承_第2页
第2页 / 共63页
清华c+语言程序设计:第14章 继承_第3页
第3页 / 共63页
清华c+语言程序设计:第14章 继承_第4页
第4页 / 共63页
清华c+语言程序设计:第14章 继承_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《清华c+语言程序设计:第14章 继承》由会员分享,可在线阅读,更多相关《清华c+语言程序设计:第14章 继承(63页珍藏版)》请在金锄头文库上搜索。

1、第14章 继承,讲授内容,继承和派生的基本概念 继承的定义 在派生类中重定义基类的函数 基类和派生类对象的转换 类指针的使用 继承关系中构造函数、析构函数之间的关系 多重继承 复合与继承的关系,14.1 继承和派生的概念(1/2),实体之间的关系 有(has_a)类的复合 班级和学校,班级不是学校,学校拥有班级,班级是学校的一部分 是(is_a)类的继承 中学和学校,中学是学校,学校不能拥有中学,中学是学校的一个特例,是某一种学校,14.1 继承和派生的概念(2/2),继承 继承允许以现有的类为基础来构建新类 新类(派生类)继承现有类(基类)的属性和行为 派生类可以修改继承的属性和行为 派生类

2、可以增加新的属性和行为 派生类对象也是基类对象 派生类对象和基类对象可以被统一管理 复合和继承可以直观自然地描述客观世界中的实体,14.2 继承的定义(1/9),继承结构的例子无处不在 家具和柜子 建筑和房子 道路和高速公路 动物和猫 电视和彩色电视 电脑和笔记本电脑,例子1:定义基类Mammal和派生类Lion,class Mammal public: Mammal(); Mammal(); ; class Lion: public Mammal public: Lion(); Lion(); ;,14.2 继承的定义(2/9),继承的三种方式 公有继承(public) 受保护继承(prot

3、ected) 私有继承(private) 基类中的成员被派生类继承后成员对外的可见性会有所不同,14.2 继承的定义(3/9),公有继承(public) 基类中公有成员和受保护成员被继承后可见性不变 受保护继承(protected) 基类中公有成员和受保护成员被继承后都是受保护的 私有继承(private) 基类中公有成员和受保护成员被继承后都是私有的,14.2 继承的定义(4/9),基类中的私有成员 能被派生类继承 不能被派生类的成员函数直接访问 可通过定义于基类的公有和受保护成员函数访问,例子2:私有继承的例子,class Mammal public: Mammal(); Mammal()

4、; ; class Lion: private Mammal public: Lion(); Lion(); ;,14.2 继承的定义(5/9),类的层次 一个类可以是某个继承关系中的基类,也可以是另一个继承关系中的派生类 类A派生出类B,类B又派生出类C,则类B是类C的直接基类,类A是类C的间接基类 定义派生类时,直接基类要明确列出,间接基类不用列出,例子3:间接基类的例子,class A protected: int aMember; ; class B: protected A protected: int bMember; ; class C: private B protected:

5、 int cMember; ;,14.2 继承的定义(6/9),在派生类中重定义基类的函数 派生类自动继承基类的所有成员 如果基类成员函数功能不满足需要在派生类中重定义该函数 派生类对象可以直接访问自己定义的函数,也可以访问定义于基类被覆盖的函数 调用方式:基类名 + : + 函数名,例子4:派生类重定义基类成员函数(1/5),/文件people.h #if !defined _PEOPLE_H_ #define _PEOPLE_H_ class People public: /构造函数中参数s大于0表示男性,否则为女性 People(char *str, int s); People();

6、void show(); private: char *name; int sex; ; #endif,例子4:派生类重定义基类成员函数(2/5),/文件people.cpp #include #include #include “people.h“ People:People(char *str, int s) name = new charstrlen(str)+1; strcpy(name, str); if (s0) sex = 1; /男性 else sex = 0; /女性 People:People() delete name; void People:show() cout “

7、My name is “ name “, I am “; cout (sex ? “male.“ : “female.“) endl; ,例子4:派生类重定义基类成员函数(3/5),/文件teacher.h #include “people.h“ #if !defined _TEACHER_H_ #define _TEACHER_H_ class Teacher : public People public: Teacher(char *str, int s, char *sch, int y); Teacher(); void show(); private: char *school; i

8、nt years; ; #endif,例子4:派生类重定义基类成员函数(4/5),/文件 teacher.cpp #include #include #include “teacher.h“ Teacher:Teacher(char *str, int s, char *sch, int y) :People(str, s) /调用基类的构造函数 school = new charstrlen(sch)+1; strcpy(school,sch); years = (y0) ? y : 0; Teacher:Teacher() delete school; void Teacher:show(

9、) People:show(); /调用基类被重定义的函数 cout“I am in “school“ for “years “ years.“ endl; ,例子4:派生类重定义基类成员函数(5/5),/文件ex14_1.cpp /测试类Teacher #include #include “teacher.h“ main() People people(“Zhang san“, 1); Teacher teacher (“Li si“,-1, “Wuhan University“, 4); people.show(); cout endl; teacher.show(); return 0;

10、 ,14.2 继承的定义(7/9),创建派生类对象时,派生类构造函数要调用基类的构造函数 先执行基类构造函数,然后执行派生类构造函数体 基类构造函数需要参数时,显式调用,格式: Teacher:Teacher(char *s,int t,char *c,int y) :People(s,c) /调用基类的构造函数 . 基类构造函数不需要参数时(有默认构造函数),隐式调用 基类的构造函数不被继承,但会被自动调用,14.2 继承的定义(8/9),派生类重定义基类的函数 重定义函数的函数原型和基类中被重定义函数的函数原型必须完全相同 不同则是函数重载 重定义之后两个函数共存,但调用方法不同 调用基类

11、函数:基类名 + : + 函数名 调用派生类函数:直接调用,14.2 继承的定义(9/9),派生类和基类的转换 派生类和基类具有不同的类型 派生类对象也是基类对象,可以作为基类对象处理 可以把派生类对象直接赋值给基类对象 基类对象不能直接作为派生类对象处理(需要类型转换),14.3 类指针(1/3),类是一种新的用户自定义类型 类名可以用来声明变量(类的对象)、数组、指针等 类的指针可以操作类的对象,也可以操作派生类的对象(派生类对象也是基类对象) 派生类对象和基类对象可以通过指针统一操作和管理,14.3 类指针(2/3),类指针操作类对象的几种可能 基类指针操作基类对象(自然) 派生类指针操

12、作派生类对象(自然) 基类指针操作派生类对象把派生类对象作为基类对象看(安全) 派生类指针操作基类对象把基类对象作为派生类对象看(危险),例子5:用类指针操作基类和派生类对象(1/9),/文件people.h #if !defined _PEOPLE_H_ #define _PEOPLE_H_ class People public: /构造函数中参数s大于0表示男性,否则为女性 People(char *str, int s); People(); int getSex(); char* getName(); private: char *name; int sex; ; #endif,例子

13、5:用类指针操作基类和派生类对象(2/9),/文件people.cpp #include #include #include “people.h“ People:People(char *str, int s) name = new charstrlen(str)+1; strcpy(name, str); if (s0) sex = 1; /男性 else sex = 0; /女性 People:People() delete name; ,例子5:用类指针操作基类和派生类对象(3/9),int People:getSex() return sex; char * People:getNam

14、e() static char str128; strcpy(str,name); return str; ,例子5:用类指针操作基类和派生类对象(4/9),/文件teacher.h #include “people.h“ #if !defined _TEACHER_H_ #define _TEACHER_H_ class Teacher : public People public: Teacher(char *str, int s, char *sch, int y); Teacher(); int getWorkYears(); char *getSchool(); private: c

15、har *school; int years; ; #endif,例子5:用类指针操作基类和派生类对象(5/9),/文件 teacher.cpp #include #include #include “teacher.h“ Teacher:Teacher(char *str,int s,char *sch,int y) :People(str, s) /调用基类的构造函数 school = new charstrlen(sch)+1; strcpy(school,sch); years = (y0) ? y : 0; Teacher:Teacher() delete school; ,例子5:

16、用类指针操作基类和派生类对象(6/9),int Teacher:getWorkYears() return years; char * Teacher:getSchool() static char str1024; strcpy(str,school); return str; ,例子5:用类指针操作基类和派生类对象(7/9),/文件ex14_2.cpp #include #include “teacher.h“ main() People p(“Zhang San“, 1), *pptr; Teacher t(“Li Si“, 0, “Wuhan University“, 4), *tptr;

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

当前位置:首页 > 高等教育 > 大学课件

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