[工程科技]第八章-继承与派生

上传人:tia****nde 文档编号:70490321 上传时间:2019-01-17 格式:PPT 页数:64 大小:1.13MB
返回 下载 相关 举报
[工程科技]第八章-继承与派生_第1页
第1页 / 共64页
[工程科技]第八章-继承与派生_第2页
第2页 / 共64页
[工程科技]第八章-继承与派生_第3页
第3页 / 共64页
[工程科技]第八章-继承与派生_第4页
第4页 / 共64页
[工程科技]第八章-继承与派生_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《[工程科技]第八章-继承与派生》由会员分享,可在线阅读,更多相关《[工程科技]第八章-继承与派生(64页珍藏版)》请在金锄头文库上搜索。

1、2019/1/17,北京邮电大学信息与通信工程学院,1,C+高级语言程序设计,第8章 继承与派生,第8章 继承与派生,8.1 继承的概念 8.2 定义基类和派生类 8.3 构造函数和析构函数 8.4 转换与继承,回顾,上章: 类 对象 本章: 继承的概念和分类; 继承的用法:如何继承某个祖先类的功能,如何为后代类添加新的功能。,2019/1/17,北京邮电大学信息与通信工程学院,-4-,8.1 继承的概念,自行车 Bicycle,自行车,8.1 继承的概念-例子,双人自行车 Tandem Bike,8.1 继承的概念-例子,竞速自行车 Racing Bike,8.1 继承的概念-例子,8.1

2、继承的概念-例子,山地车 Mountain Bike,8.1 继承的概念-例子,山地车继承了自行车的特征 山地车 “派生”于 自行车,8.1 继承的概念,类的继承是在现有类的基础之上,创建新类的机制。 称现有的类为基类,新建立的类为派生类。,int Wheel; bool Run();,int Wheel; bool Run();,int Seat;,从基类 继承,2019/1/17,北京邮电大学信息与通信工程学院,-11-,8.2 定义基类和派生类,8.2 定义基类和派生类,定义派生类时要声明继承方式 访问控制受继承方式的影响 继承导致一种特殊的语法现象:同名覆盖 三种继承方式 public

3、、protected、private 不同继承方式的影响主要体现在: 派生类 成员 对基类成员的访问控制 派生类 对象 对基类成员的访问控制,2019/1/17,北京邮电大学信息与通信工程学院,-13-,8.2.1 简单的继承和派生,例8-1 简单的继承和派生,问题:想在屏幕上画出正三角形、矩形或圆形 方法一:结构化方法 DrawTri (int x, int y, char color, int side); DrawRect (int x, int y, char color, int length, int width) DrawCircle(int x, int y, char col

4、or, int Radius) 方法二:面向对象? class circle 圆形 class rectangle 矩形 class triangle 三角形 基类: class shape 色彩 color 位置 (x, y),class Tshape private: uint _x, _y; /几何形状的位置 public: TShape( ); uint getX( ); uint getY( ); void setX( uint x ); void setY( uint y ); void Draw( ); ;,成员函数的分类 1、构造函数 2、设置属性值 3、读取属性值,/TSha

5、pe01.cpp: 类TShape的实现 #include “TShape01.h“ #include using namespace std; TShape:TShape( ) _x = 10; _y = 10; void TShape:Draw( ) cout“This is TShape:Draw()“endl; ,成员函数的分类 构造函数 设置属性值 读取属性值 执行,#include “TShape01.h“ class TEllipse: public TShape public: void Draw( ); ;,/ TEllipse01.cpp: 类TEllipse的实现 #in

6、clude “TEllipse01.h“ #include using namespace std; void TEllipse:Draw( ) cout“Draw an ellipse with color“endl; ,2019/1/17,北京邮电大学信息与通信工程学院,-19-,8.2.2 定义派生类,8.2.2 定义派生类,class 派生类名 : 继承方式 基类1, 继承方式 基类2, , 继承方式 基类n 派生类成员声明; ; 例如: 已有基类b1和b2,定义派生类derive,其中包括私有整型成员 newInt,公有函数成员 int newFun(),私有函数成员 int max

7、(int a, int b);写出类derive的定义,class derive : public b1 , private b2 private: int newInt; public: void newFun(); private: int max( int a, int b ); ;,2019/1/17,北京邮电大学信息与通信工程学院,-21-,8.2.3 访问控制和继承关系,8.2.3 访问控制和继承关系,类成员的可见性 公有成员:public 保护成员:protected 私有成员:private 继承的方式 公有继承(public) 保护继承(protected) 私有继承(pri

8、vate) 派生类继承了基类中的所有成员,但不包括 构造函数 析构函数,8.2.3 访问控制和继承关系,不同继承方式决定的不同访问控制权限体现在: 派生类的成员函数对其继承的基类成员的访问控制; 其它模块通过派生类对象对其继承的基类成员的访问控制。,继承来的成员 的访问权限?,1. 公有继承,公有继承的派生类定义形式: class 派生类名:public 基类名 派生类新成员定义; ;,基类成员 在派生类中的访问属性不变; 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员; 派生类以外的其它函数 可以通过派生类的对象,访问从基类继承的公有成员, 但不能访问从基类继承的

9、保护成员和私有成员。,派生类成员 函数可以访问,class Point /基类 public: void InitP(float xx=0, float yy=0) X=xx; Y=yy; void Move(float xOff, float yOff) X+=xOff; Y+=yOff; float GetX() return X; float GetY() return Y; private: float X,Y; ;,class Rectangle: public Point /派生类 public: /新增公有函数成员 void InitR(float x, float y, flo

10、at w, float h) InitP(x,y); /访问基类公有函数 W=w;H=h; float GetH() return H; float GetW() return W; private: /新增私有数据成员 float W,H; ;,int main( ) Rectangle rect; coutrect.X; /可否? coutrect.GetX( ); /可否? return 0; ,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,class Point public: void InitP( float

11、xx=0, float yy=0 ) X=xx; Y=yy; void Move( float xOff, float yOff ) X+=xOff; Y+=yOff; float GetX( ) return X; float GetY( ) return Y; private: float X,Y; ;,class Rect: public Point public: /新增公有函数成员 Rect(float x, float y, float w, float h) X=x; Y=y; W=w;H=h; float GetH( ) return H; float GetW( ) retu

12、rn W; private: /新增私有数据成员 float W,H; ;,int main( ) Rect r(1, 2, 3, 4); coutr.X; coutr.GetX( ); return 0 ,A. public: B. private: C. protected: D. 什么都不填,2. 私有继承,私有继承的派生类定义形式: class 派生类名:private 基类名 派生类新成员定义; ;,基类成员 在派生类中的访问属性都变成 private; 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员; 派生类以外的其它函数 不能通过派生类的对象,访问从基

13、类继承的任何成员。,派生类成员 函数可以访问,派生类对象,3.保护继承,私有继承的派生类定义形式: class 派生类名:protected 基类名 派生类新成员定义; ;,基类成员 公有成员和保护成员在派生类中变成保护类型的,基类的私 有成员属性不变; 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员; 派生类以外的其它函数 不能通过派生类的对象,访问从基类继承的任何成员。,派生类成员 函数可以访问,派生类对象,私有继承和保护继承的区别,孙类成员函数无法访问,孙类成员函数可以访问,继承方式影响访问控制,2019/1/17,北京邮电大学信息与通信工程学院,-31-,8

14、.2.4 同名覆盖,8.2.4 同名覆盖 override,class base public: void f ( ) cout“base“endl; ; class deriver: public base public: void f ( ) cout“deriver“endl; ; int main( ) deriver derobj; derobj.f (); return 0; ,输出结果? A: base B: deriver,OverRide,只能访问到派生类中的同名新成员,class Shape public: void Draw() ; protected: ;,class

15、Triangle: public Shape public: Triangle( int x, int y, char color=R, float slen = 1 ); float GetSideLength( ) const; void SetTriangle( int x, int y, char color, float slen ); void Draw( ); private: float m_SideLength; ;,图形类中的同名覆盖,2019/1/17,北京邮电大学信息与通信工程学院,-34-,8.3 构造函数和析构函数,8.3 构造函数与析构函数,基类的构造函数和析构函

16、数不能被派生类所继承 派生类一般需要定义自己的构造函数和析构函数 派生类的构造及析构函数通常会受到基类构造及析构函数的影响,2019/1/17,北京邮电大学信息与通信工程学院,-36-,8.3.1 基类只有无参数构造函数,8.3.1 基类只有无参数的构造函数,在基类具有无参构造函数,派生类又没有定义构造函数的时候,系统会自动的调用基类无参构造函数,来构造派生类对象中的基类成分。 如果基类没有无参构造函数,派生类也不定义自己的构造函数,在编译的时候,一定会有语法错误。,2019/1/17,北京邮电大学信息与通信工程学院,-38-,8.3.2 派生类的构造函数,8.3.2 派生类的构造函数,不参与继承的特殊函数 构造函数 析构函数 作为特权地位的友元函数 赋值运算符函数 派

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

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

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