C++派生类与继承

上传人:豆浆 文档编号:47584179 上传时间:2018-07-03 格式:PPT 页数:94 大小:992.50KB
返回 下载 相关 举报
C++派生类与继承_第1页
第1页 / 共94页
C++派生类与继承_第2页
第2页 / 共94页
C++派生类与继承_第3页
第3页 / 共94页
C++派生类与继承_第4页
第4页 / 共94页
C++派生类与继承_第5页
第5页 / 共94页
点击查看更多>>
资源描述

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

1、第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室派生类与继承第第0505章章第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室主要内容4.24.2 继承方式继承方式4.34.3 派生类的构造函数和析构函数派生类的构造函数和析构函数4.44.4 多重继承多重继承4.54.5 虚基类虚基类4.64.6 赋值兼容性赋值兼容性4.14.1 基类和派生类基类和派生类第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室1、什么是继承?J举个简单的例子:“狗”和“柯利狗”。当谈论 “狗”的时候,知道它是哺乳动物,有4条腿 ,1条尾巴,喜

2、欢啃肉骨头,现在谈论“ 黑狗”,人们会怎么说呢?J一种是说“柯利狗是一种哺乳动物,有4条腿 ,1条尾巴,喜欢吃肉骨头,并且尖 鼻子、红白相间毛色、适合放牧”。 J另一种是说:“柯利狗就是适合放牧、尖鼻 子、红白相间毛色的狗”。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室什么是继承?J比较一下柯利狗的两种说法,显然后一种说法更好 。那么它好在哪里呢? J第一,它更简练; J第二,更重要的是它反映了“狗”和“柯利狗”这两个 概念的内在联系。“狗”和“柯利狗”之间存在一条重 要的联系,那就是所有的“柯利狗”都是“狗”,或者 说,“柯利狗”是一类特殊的“狗”。根据这一条,

3、“ 狗”所具有的特征,例如4条腿,1条尾巴等,“柯 利狗”自然都具有。也就是说,“柯利狗”从“狗”那 里继承了“狗”的全部特征。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室继承的层次结构食品食品水果水果蔬菜蔬菜苹果苹果香蕉香蕉红苹果红苹果青苹果青苹果下层具有上层的特 征,同时加入自己 的特征。每层比上 层更具体,符合人 类认识世界的规律 。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室面向对象中的继承和派生J继承和派生:一个新类可以从现有的类继承 特征(属性和方法);从现有的类产生新类 的过程称为派生。J现有的用来派生新类的类称为基类或

4、父类, 派生出来的类称为派生类或子类。 J派生类可以作为基类继续派生新的类,从而 形成类的层次结构。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室2、派生类的定义class 派生类名 : 继承方式 基类名 private: 成员声明列表protected: 成员声明列表public: 成员声明列表 ;派生类新派生类新 增的成员增的成员第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室派生类的定义J继承方式 public:公有继承 private:私有继承 protected:保护继承J通常在派生类类体中列出新增的数据成员和 成员函数(个性),

5、基类的成员将自动成为 派生类的成员(共性),不用重复编写。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室3、派生类示例:基类class CPoint int x,y; public: CPoint() x=0; y=0; CPoint(int a,int b) x=a; y=b; void SetVal(int a, int b)x=a; y=b; int GetX() return x; int GetY() return y; ;第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室派生类示例:派生类class Circle : public

6、 CPoint int radius; public: Circle() radius=0; Circle(int a,int b,int r):CPoint(a,b) radius=r; void SetR(int r) radius=r; int GetR() return radius; ;初始化从初始化从 基类继承基类继承 得来的成得来的成 员员第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室派生类示例:mainvoid main() Circle c(3,4,5); couta=a; ;第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研

7、室虚基类完整示例:中间派生类class B : virtual public A public: int b; B(int a, int b) : A(a) this-b=b; ; class C : virtual public A public: int c; C(int a,int c) : A(a) this-c=c; ;第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室虚基类完整示例:最终派生类class D : public B, public C public: int d; D(int a,int b,int c,int d,int ba,int ca)

8、 : B(ba,b), C(ca,c), A(a) this-d=d; void main() D obj(1,2,3,4,5,6); 被忽略被忽略初始化初始化b b和和c c直接初始直接初始 化基类化基类第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室补充说明J定义D类对象时,由D类构造函数直接初始化虚 基类成员,而忽略B类和C类的对基类的初始化 调用;如果要定义B(或C类)的对象,则B类构 造函数中对A类的构造函数调用会起作用。 J使用多继承,可以实现比较复杂的继承和共享逻 辑,但容易造成二义性等问题,往往需要使用虚 基类,但虚基类的使用非常容易出错,应该慎用 。

9、第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室主要内容4.24.2 继承方式继承方式4.34.3 派生类的构造函数和析构函数派生类的构造函数和析构函数4.44.4 多重继承多重继承4.54.5 虚基类虚基类4.64.6 赋值兼容性赋值兼容性4.14.1 基类和派生类基类和派生类第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室1、赋值兼容性概念J如果类B公有继承于类A,类B的每一个对象也是 一个类A的对象,但反之则不然。“每一只柯利狗 都是狗”。 J如果说A表示一个比B更普遍的概念,也就是B表 示一个比A更特殊的概念。可以断言: 在可以使用

10、类A的对象的任何地方,则类B的对象同样也能使 用,因为每一个类B的对象“就是一个”类A的对象 。另一方面,如果需要一个类B的对象,则类A的 对象就不行;每个B都是A,但反之则不然。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室每个学生都是人class Person .;class Student: Public Person .;J每个学生都是人,但并不是每个人都是学生。 J可以期望任何一件对于人来说是真实的事情,对学 生也是真实的,例如他或她都有生日,对于学生同 样也是真实的。但却不能期望每一件对于学生来说 是真实的事情,对所有的人都是真实的。 J“人”的概念要比

11、“学生”的概念来得更广泛些;而“ 学生”则是一种特殊类型的“人”。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室2、赋值兼容性规则J每一个派生类的对象,都是基类的一个对象 。赋值兼容规则是指在公有派生情况下,一 个公有派生类的对象可以当作基类的对象使 用,反之则禁止。C派生类的对象可以赋值给基类对象。 C派生类的对象可以初始化基类的引用。 C指向基类的指针也可以指向派生类。 C注意:通过基类对象名、指针只能使用从基类 继承的成员第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室3、赋值兼容性示例:CPoint类class CPoint int

12、 x,y; public: CPoint() x=0; y=0; CPoint(int a,int b) x=a; y=b; void Set(int a, int b)x=a; y=b; void Show() coutShow(); /调用基类的Show b=a; b.Show(); 运行结果运行结果 2,32,3 2,32,3 2,32,3第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室调用基类的showvoid fun(CPoint void main() Circle a(2,3,4); fun(a); 运行结果运行结果 2,32,3第第0505章章 派生类

13、与继承派生类与继承信工计算机教研室信工计算机教研室调用基类的showvoid fun(CPoint* p) p-Show(); void main() Circle a(2,3,4); fun( 运行结果运行结果 2,32,3第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室迂回的解决void fun(CPoint* p) p-Show(); /基类 Circle *pc=(Circle *)p; pc-Show(); /派生类 void main() Circle a(2,3,4); fun( 运行结果运行结果 2,32,34 4p p指向派指向派 生类对象生类对象将

14、基类地址强将基类地址强 行转换成派生行转换成派生 类地址类地址第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室主要内容4.24.2 继承方式继承方式4.34.3 派生类的构造函数和析构函数派生类的构造函数和析构函数4.44.4 多重继承多重继承4.54.5 虚基类虚基类4.64.6 赋值兼容性赋值兼容性4.14.1 基类和派生类基类和派生类4.74.7 继承与聚合继承与聚合第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室1、扩展功能的两种方法JC+中有两种扩充功能的做法,一种方法 是继承,派生类继承了基类的数据成员和方 法。 J另一种方法就是

15、聚合,就是在一个类中放置 其他类的对象构成对象成员,以扩充类的功 能。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室2、继承方法J继承方法应该满足isa关系,也就是派生类 对象是基类对象。如Student类是从 People类中派生出来的,“学生是人”就满 足isa关系。 J有些情况下,采用继承的方法容易产生错觉 。如已有一个address类,它描述地址这个 概念,现在要建立一个worker类,它描述 职工这个概念,每个职工都有一个住址。 第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室3、引入聚合方法class address ; class worker: public address ; J采用继承的方法,推导出“职工”是“地址”。 显然与实际情况不符合,应该用聚合的方法 实现。 J聚合的方法描述的是“职工”包含有一个“地 址”,属于has-a关系,地址只是职工的一 个属性。第第0505章章 派生类与继承派生类与继承信工计算机教研室信工计算机教研室聚合方法class Address char *name; int postcode; ; class Person char *name; Address d; ;第第0505章章 派生类与继承派生

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

当前位置:首页 > 学术论文 > 毕业论文

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