《c程序设计基础》第八章-继承和派生.ppt
《《c程序设计基础》第八章-继承和派生.ppt》由会员分享,可在线阅读,更多相关《《c程序设计基础》第八章-继承和派生.ppt(106页珍藏版)》请在三一办公上搜索。
1、C+程序设计基础,第8章 继承与派生北京邮电大学信通院方莉,2,第8章 继承与派生,类具有封装性、继承性和多态性,使得软件开发者可以把类设计成相对独立的模块,像一个个积木块,便于重用。类的继承性是实现软件重用的一种重要形式。本章将学习:继承和派生的概念,继承方式;派生类的构造函数和析构函数;,3,第8章 继承与派生,8.1 继承的概念8.2 定义基类和派生类8.3 构造函数和析构函数8.4 转换与继承,4,8.1 继承的概念-例子,自行车Bicycle,山地车 Mountain Bike,竞速自行车 Racing Bike,双人自行车 Tandem Bike,5,8.1 继承的概念-例子,山地
2、车继承了自行车的特征山地车“派生”于 自行车,6,8.1 继承的概念,类的继承是在现有类的基础之上,创建新类的机制。称现有的类为基类,新建立的类为派生类。派生类继承了基类的属性和行为派生类是基类的特殊情况。基类是共性的抽象,派生类是个性的体现。不必从“草稿”开始创建特殊的程序对象。继承是处理“特殊情况”的面向对象编程机制。,7,8.1 继承的概念,8,第8章 继承与派生,8.1 继承的概念8.2 定义基类和派生类8.3 构造函数和析构函数8.4 转换与继承,9,8.2 定义基类和派生类,定义派生类时要声明继承方式,三种继承方式:publicProtectedprivate 访问控制受继承方式的
3、影响;不同继承方式的影响主要体现在:派生类成员对基类成员的访问控制;派生类对象对基类成员的访问控制;继承导致一种特殊的语法现象:同名覆盖。,10,8.2.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 color,int Radius)方法二:面向对象?class circle 圆形class rectangle 矩形cl
4、ass triangle 三角形基类:class shape色彩 color位置(x,y),泛化?,11,图形circle 圆形rectangle 矩形triangle 三角形,基类称为父类派生类称为子类,分层次的设计类使模块划分更合理;便于软件系统的设计和维护。,8.2.1 简单的继承和派生,12,class Shapeprivate:int m_x,m_y;/位置 char m_color;/颜色public:Shape();void setposition(int x,int y);void setcolor(char color);int getx();int gety();char
5、getcolor();,例1-定义基类shape,成员函数的分类:构造函数设置属性值读取属性值,13,class 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;,例1-定义派生类(等边三角形类),成员函数的分类:构造函数设置属性值读取属性值,14,派生类的
6、定义格式class 派生类名:继承方式 基类名 public:/派生类公有成员 private:/派生类私有成员,派生类只有一个直接基类为单继承,8.2.2 定义派生类,15,class 派生类名:继承方式 基类名1,继承方式 基类名n public:/派生类公有成员 private:/派生类私有成员,有多个基类,派生类有多个基类为多继承,8.2.2 定义派生类,16,例如:已有基类b1和b2,定义派生类derive,其中包括:私有整型成员 newInt,公有函数成员 int newFun(),私有函数成员 int max(int a,int b);写出类derive的定义,8.2.2 定义派
7、生类,class derive:public b1,private b2private:int newInt;public:void newFun();private:int max(int a,int b);,17,类的继承方式是派生类对基类成员的继承方式。类的继承方式影响类外模块对于派生类从基类继承来的成员的访问权限。每一个“继承方式”,只用于限制对紧随其后之基类的继承。,class derive:public b1,private b2private:int newInt;public:void newFun();private:int max(int a,int b);,8.2.2 定
8、义派生类,18,class base;class deriver1:public base;class deriver2:public deriver1,父类被称为子类的直接基类 父类的父类或更高层次的父类被称为这个子类的间接基类,8.2.2 定义派生类,19,class Shape:public:Shape(int x=0,int y=0,char c=R);int GetX()const;void SetX(int x);int GetY()const;void SetY(int x);char GetColor()const;void SetColor(char c);protected
9、:char m_color;int m_x;int m_y;,例2-图形类及其派生类的声明,20,class Circle:public Shape public:Circle(int x,int y,float r=1,char color=R);void SetCircle(int x,int y,float r,char color);float GetRadius()const;void Draw();private:float m_Radius;,例2-图形类及其派生类的声明,21,class Triangle:public Shape public:Triangle(int x,i
10、nt y,char color=R,float slen=1);void SetTriangle(int x,int y,char color,float slen);float GetSideLength()const;void Draw();private:float m_SideLength;,例2-图形类及其派生类的声明,22,class Rectangle:public Shapepublic:Rectangle(int x,int y,char color,int length=10,int width=10);void SetRectangle(int x,int y,char
11、color,int length,int width);int GetWidth()const;int GetHeight()const;void Draw();private:int m_Width;int m_Length;,例2-图形类及其派生类的声明,23,派生类的成员包括:(1)继承基类的成员,(2)派生类定义时声明的成员。派生类自己增加的成员,完成两个需求:(1)修改基类成员,(2)描述新的特征或方法。,从基类继承的成员,派生类增加的成员,24,8.2.3 访问控制和继承关系,类成员的可见性公共成员:public保护成员:protected私有成员:private继承的方式公有继承
12、(public)保护继承(protected)私有继承(private)派生类继承了基类中的所有成员,但不包括构造函数析构函数,25,8.2.3 访问控制和继承关系,不同继承方式决定的不同访问控制权限体现在:派生类的成员函数对其继承的基类成员的访问控制;其它模块通过派生类对象对其继承的基类成员的访问控制。,继承来的成员的访问权限?,26,1.公有继承,公有继承的派生类定义形式:class 派生类名:public 基类名派生类新成员定义;;,基类成员 在派生类中的访问属性不变。派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数 可以通过派生类的对象,
13、访问从基类继承的公有成员,但不能访问从基类继承的保护成员和私有成员。,派生类成员函数可以访问,27,public是定义公有继承方式的关键字。公有继承方式定义的派生类,继承了基类中除构造函数和析构函数外的其余成员:公有成员、保护成员和私有成员被继承的基类成员在派生类中仍将保持其原来的访问属性。派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数可以通过派生类的对象,访问从基类继承的公有成员,但不能访问从基类继承的保护成员和私有成员。,8.2.3 访问控制和继承关系,28,class Point/基类Point类的定义public:/公有函数成员void
14、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;,8.2.3 访问控制和继承关系,29,class Rectangle:public Point/派生类声明部分public:/新增公有函数成员void InitR(float x,float y,float w,float h)InitP(x,y);/?访问基类公有成员函数 W=w;H=h;
15、float GetH()return H;float GetW()return W;private:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,30,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 只能访问基类的public成员,8.2.3 访问控制和继承关系,错误,正确,31,class Rectangle:public Point/派生类声明部分public:/新增公有
16、函数成员void InitR(float x,float y,float w,float h)X=x;Y=y;/?访问基类私有成员 W=w;H=h;float GetH()return H;float GetW()return W;private:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,错误,32,class Point/基类Point类的定义public:void InitP(float xx=0,float yy=0)X=xx;Y=yy;vo
17、id Move(float xOff,float yOff)X+=xOff;Y+=yOff;float GetX()return X;float GetY()return Y;protected:float X,Y;,8.2.3 访问控制和继承关系,33,class Rectangle:public Point/派生类声明部分public:/新增公有函数成员void InitR(float x,float y,float w,float h)X=x;Y=y;/?访问基类的保护成员 W=w;H=h;float GetH()return H;float GetW()return W;private
18、:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,34,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 只能访问基类的public成员,依然错误!,8.2.3 访问控制和继承关系,正确,35,2.私有继承,私有继承的派生类定义形式:class 派生类名:private 基类名派生类新成员定义;;,基类成员:在派生类中的访问属性都变成 private。派生类的成员函数:可以
19、访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任何成员。,派生类成员函数可以访问,36,private是定义私有继承方式的关键字以私有继承方式定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员,这些成员在派生类中的访问属性都是私有的。派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员。派生类以外的其它函数则不能通过派生类的对象访问从基类继承的任何成员。,8.2.3 访问控制和继承关系,37,class Point/基类声明public:void InitP(float xx=0,flo
20、at 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;,8.2.3 访问控制和继承关系,38,class Rectangle:private Point/派生类声明public:/新增外部接口void InitR(float x,float y,float w,float h)InitP(x,y);W=w;H=h;/?派生类访问基类公有成员void Move(float xOff,float yOf
21、f)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,39,class Rectangle:private Point/派生类声明public:/新增外部接口void InitR(flo
22、at x,float y,float w,float h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问
23、控制和继承关系,错误,40,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;protected:float X,Y;,8.2.3 访问控制和继承关系,41,class Rectangle:private Point/派生类声明public:/新增外部接口void InitR(float x,float y,float w,float
24、h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,8.2.3 访问控制和继承关系,正确,42,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 不能访问基类中的任
25、何成员。,8.2.3 访问控制和继承关系,错误,错误,43,3.保护继承,保护继承的派生类定义形式:class 派生类名:protected 基类名派生类新成员定义;;,基类成员:公有成员和保护成员在派生类中变成保护类型的,基类的私有成员属性不变。派生类的成员函数:可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任何成员。,派生类成员函数可以访问,44,protected是定义保护继承方式的关键字以保护继承方式定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员。其中基类的公有成员和保护成员在派生类中访问控
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c程序设计基础 程序设计 基础 第八 继承 派生
链接地址:https://www.31ppt.com/p-5896073.html