第八章-继承和派生(删减)_第1页
第八章-继承和派生(删减)_第2页
第八章-继承和派生(删减)_第3页
第八章-继承和派生(删减)_第4页
第八章-继承和派生(删减)_第5页
已阅读5页,还剩80页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序设计基础程序设计基础第第8章章 继承与派生继承与派生北京邮电大学信通院北京邮电大学信通院方莉方莉2第第8 8章章 继承与派生继承与派生v类类具有具有封装性、继承性和多态性封装性、继承性和多态性,使得软件开发,使得软件开发者可以把类设计成相对独立的模块,像一个个积者可以把类设计成相对独立的模块,像一个个积木块,便于重用。木块,便于重用。v类的继承性类的继承性是实现是实现软件重用软件重用的一种重要形式。的一种重要形式。v本章将学习:本章将学习: 继承和派生的概念,继承方式;继承和派生的概念,继承方式; 派生类的构造函数和析构函数;派生类的构造函数和析构函数;3第第8 8章章 继承与派生继承

2、与派生8.1 8.1 继承的概念继承的概念8.2 8.2 定义基类和派生类定义基类和派生类8.3 8.3 构造函数和析构函数构造函数和析构函数8.4 8.4 转换与继承转换与继承48.1 8.1 继承的概念继承的概念- -例子例子自行车自行车Bicycle山地车山地车 Mountain Bike竞速自行车竞速自行车 Racing Bike双人自行车双人自行车 Tandem Bike5Bicycle MountainBikesRacingBikesTandemBikesis-a relationships8.1 8.1 继承的概念继承的概念- -例子例子v山地车山地车继承继承了自行车的特征了自行

3、车的特征山地车山地车 “派生派生”于于 自行车自行车68.1 8.1 继承的概念继承的概念 v类的继承类的继承是在现有类的基础之上,创建新类的机制是在现有类的基础之上,创建新类的机制。称现有的类为称现有的类为基类基类,新建立的类为新建立的类为派生类派生类。 派生类继承了基类的属性和行为派生类继承了基类的属性和行为 派生类是基类的特殊情况。派生类是基类的特殊情况。v基类是基类是共性的抽象共性的抽象,派生类是,派生类是个性的体现个性的体现。v不必从不必从“草稿草稿”开始创建特殊的程序对象。开始创建特殊的程序对象。v继承是处理继承是处理“特殊情况特殊情况”的面向对象编程机制。的面向对象编程机制。 7

4、Bike基类Tandem Bike派生类派生于int Wheel;bool Run();int Wheel;bool Run();int Seat;父类子类 从基类继承8.1 8.1 继承的概念继承的概念 8第第8 8章章 继承与派生继承与派生8.1 8.1 继承的概念继承的概念8.2 8.2 定义基类和派生类定义基类和派生类8.3 8.3 构造函数和析构函数构造函数和析构函数8.4 8.4 转换与继承转换与继承98.2 8.2 定义基类和派生类定义基类和派生类v定义派生类时要声明继承方式定义派生类时要声明继承方式,三种继承方式:,三种继承方式: publicpublic ProtectedP

5、rotected private private v访问控制受继承方式的影响;访问控制受继承方式的影响;v不同继承方式的影响主要体现在:不同继承方式的影响主要体现在: 派生类成员对基类成员的访问控制;派生类成员对基类成员的访问控制; 派生类对象对基类成员的访问控制;派生类对象对基类成员的访问控制;v继承导致一种特殊的语法现象:继承导致一种特殊的语法现象:同名覆盖同名覆盖。108.2.1 8.2.1 简单的继承和派生简单的继承和派生v 问题:想在屏幕上画出正三角形、矩形或圆形问题:想在屏幕上画出正三角形、矩形或圆形v 方法一:结构化方法方法一:结构化方法 DrawTri (int x, int

6、y, char color, int side);DrawTri (int x, int y, char color, int side); DrawRect (int x, int y, char color, int length, int width)DrawRect (int x, int y, char color, int length, int width) DrawCircle(int x, int y, char color, int Radius)DrawCircle(int x, int y, char color, int Radius)v 方法二:面向对象?方法二:面

7、向对象? class circle class circle 圆形圆形 class rectangle class rectangle 矩形矩形 class triangle class triangle 三角形三角形 基类:基类: class shapeclass shape 色彩色彩 colorcolor 位置位置 (x, y)(x, y)shapecirclerectangletriangle泛化?11v图形图形 circle circle 圆形圆形 rectangle rectangle 矩形矩形 triangle triangle 三角形三角形 基类称为基类称为父类父类派生类称为派生

8、类称为子类子类 shapecirclerectangletrianglev 分层次的设计类使模块划分更合分层次的设计类使模块划分更合理;便于软件系统的设计和维护理;便于软件系统的设计和维护。8.2.1 8.2.1 简单的继承和派生简单的继承和派生12class 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 getcolor();例

9、例1- 1-定义基类定义基类shapeshape成员函数的分类:成员函数的分类:v构造函数构造函数v设置属性值设置属性值1. 读取属性值读取属性值13class 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- 1-定义派生类定义

10、派生类( (等边三角形类等边三角形类) )成员函数的分类:成员函数的分类:v构造函数构造函数v设置属性值设置属性值1. 读取属性值读取属性值14派生类的定义格式派生类的定义格式class class 派生类名:派生类名:继承方式继承方式 基类名基类名 public: public: / /派生类公有成员派生类公有成员 private:private: / /派生类私有成员派生类私有成员 ;派生类派生类只有只有一个直接基一个直接基类类为为单继承单继承8.2.2 8.2.2 定义派生类定义派生类15 class 派生类名:派生类名:继承方式继承方式 基类名基类名1, 继承方式继承方式 基类名基类名

11、n public: /派生类公有成员派生类公有成员 private: /派生类私有成员派生类私有成员 有多个基类有多个基类派生类有派生类有多个基类多个基类为为多继承多继承8.2.2 8.2.2 定义派生类定义派生类16u例如例如: : 已有基类已有基类b1b1和和b2b2,定义派生类定义派生类derivederive,其中包括:,其中包括:u私有整型成员私有整型成员 newIntnewInt,u公有函数成员公有函数成员 int int newFun()newFun(),u私有函数成员私有函数成员 int int max(int a, int b)max(int a, int b);u写出类写出

12、类derivederive的定义的定义8.2.2 8.2.2 定义派生类定义派生类class derive : public b1 , private b2private: int newInt;public: void newFun();private:int max( int a, int b );17v 类的继承方式是类的继承方式是派生类对基类成员的继承方式派生类对基类成员的继承方式。v 类的继承方式影响类外模块对于派生类从基类继承来的成员类的继承方式影响类外模块对于派生类从基类继承来的成员的的访问权限访问权限。v 每一个每一个“继承方式继承方式”,只用于限制对,只用于限制对紧随其后紧随

13、其后之基类的继承。之基类的继承。class derive : public b1 , private b2private: int newInt;public: void newFun();private:int max( int a, int b );8.2.2 8.2.2 定义派生类定义派生类18class base ;class deriver1:public base ;class deriver2:public deriver1 父类被称为子类的父类被称为子类的直直接基类接基类 父类的父类或更高层父类的父类或更高层次的父类被称为这个次的父类被称为这个子类的子类的间接基类间接基类 8.

14、2.2 8.2.2 定义派生类定义派生类19class 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:char m_color;int m_x;int m_y; ;例例2-2-图形类及其派生类的声明图形类及其派生类的声明20class Circle : public Shape public:Cir

15、cle(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-2-图形类及其派生类的声明图形类及其派生类的声明21class Triangle: public Shape public:Triangle(int x, int y, char color=R, float slen = 1);void SetTriangle(int x, in

16、t y, char color, float slen);float GetSideLength() const; void Draw();private:float m_SideLength;例例2-2-图形类及其派生类的声明图形类及其派生类的声明22class Rectangle: public Shapepublic:Rectangle(int x, int y, char color, int length=10, int width=10);void SetRectangle (int x, int y, char color, int length, int width); int

17、 GetWidth() const;int GetHeight() const;void Draw();private:int m_Width;int m_Length;例例2-2-图形类及其派生类的声明图形类及其派生类的声明23 派生类的成员包括:(派生类的成员包括:(1 1)继承基)继承基类的成员,(类的成员,(2 2)派生类定义时声)派生类定义时声明的成员。明的成员。 派生类自己增加的成员,完成两个派生类自己增加的成员,完成两个需求:需求:(1)(1)修改基类成员,(修改基类成员,(2 2)描)描述新的特征或方法。述新的特征或方法。 m_color;m_x; m_y;GetX();Set

18、X();GetY();SetY();GetColor();SetColor();m_Radius;GetRadius () SetCircle();Draw(); 从基类从基类继承的继承的成员成员派生类派生类增加的增加的成员成员248.2.3 8.2.3 访问控制和继承关系访问控制和继承关系v 类成员的可见性类成员的可见性 公有成员:公有成员:publicpublic 保护成员:保护成员:protectedprotected 私有成员:私有成员:privateprivatev 继承的方式继承的方式 公有继承公有继承(public)(public) 保护继承保护继承(protected)(pro

19、tected) 私有继承私有继承(private)(private)v 派生类继承了基类中的所有成员,派生类继承了基类中的所有成员,但不包括但不包括构造函数构造函数析构函数析构函数258.2.3 8.2.3 访问控制和继承关系访问控制和继承关系v不同继承方式决定的不同访问控制权限体现在:不同继承方式决定的不同访问控制权限体现在: 派生类的派生类的成员函数成员函数对其继承的基类成员的对其继承的基类成员的访问控制访问控制; 其它模块其它模块通过通过派生类对象派生类对象对其继承的基类成员的对其继承的基类成员的访问控访问控制。制。private:protected:public:基类?派生类publi

20、cprotectedprivate继承方式决定继承成员的访问权限继承来的成员的访问权限?261. 1. 公有继承公有继承 公有继承的派生类定义形式:公有继承的派生类定义形式: class class 派生类名:派生类名:publicpublic 基类名基类名 派生类新成员定义;派生类新成员定义; ; ;private:protected:public:基类?派生类v基类成员基类成员 在派生类中的访问属性不变。v派生类的成员函数派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;v派生类以外的其它函数派生类以外的其它函数 可以通过派生类的对象,访问从基类继承的公有成员,

21、但不能访问从基类继承的保护成员和私有成员。privateprotectedpublic派生类成员函数可以访问派生类对象基类成员的属性public27vpublicpublic是定义公有继承方式的关键字。是定义公有继承方式的关键字。v 公有继承方式定义的派生类,继承了基类中公有继承方式定义的派生类,继承了基类中除构造函数和析除构造函数和析构函数构函数外的其余成员:公有成员、保护成员和私有成员外的其余成员:公有成员、保护成员和私有成员v 被继承的基类成员在派生类中仍将被继承的基类成员在派生类中仍将保持保持其其原来的访问属性原来的访问属性。v 派生类的派生类的成员函数成员函数可以访问基类的公有成员和

22、保护成员,可以访问基类的公有成员和保护成员,不不能能访问基类的访问基类的私有成员私有成员; ;v 派生类以外的其它函数可以通过派生类的对象,访问从基类派生类以外的其它函数可以通过派生类的对象,访问从基类继承的公有成员继承的公有成员, , 但但不能不能访问从基类继承的访问从基类继承的保护成员和私有保护成员和私有成员成员。 8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系28class Point/基类基类Point类的定义类的定义public:/公有函数成员公有函数成员void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(flo

23、at xOff, float yOff) X+=xOff;Y+=yOff;float GetX() return X;float GetY() return Y;private:/私有数据成员私有数据成员float X,Y;8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系29class Rectangle: public Point/派生类声明部分派生类声明部分public:/新增公有函数成员新增公有函数成员void InitR(float x, float y, float w, float h) InitP(x,y); /?访问基类公有成员函数?访问基类公有成员函数 W=w;H

24、=h;float GetH() return H;float GetW() return W;private:/新增私有数据成员新增私有数据成员float W,H;l派生类中的派生类中的 成员函数成员函数 可以直接访问基类中可以直接访问基类中的的publicpublic和和protectedprotected成成员员,但不能访问基类,但不能访问基类的的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系30main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?l使用派生类的使用派生类的 对

25、象对象 只能只能访问基类的访问基类的publicpublic成员成员8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误正确正确31class 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:/新增私有数据成员新增私有数据成员float

26、W,H;l派生类中的派生类中的 成员函数成员函数 可以可以直接访问基类中的直接访问基类中的public和和protected成员,但成员,但不能不能访问访问基类的基类的private成员成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误32class Point/基类基类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() re

27、turn Y;protected:float X,Y;8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系33class 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:/新增私有数据成员新增私有数据成员float W,H;l派生类中的派生类

28、中的 成员函数成员函数 可以直接访问基类中可以直接访问基类中的的public和和protected成成员,但不能访问基类员,但不能访问基类的的private成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确34main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?l使用派生类的使用派生类的 对象对象 只能只能访问基类的访问基类的publicpublic成员成员依然错误依然错误! !8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确352. 2. 私有继承私有继承 私有继承的派生类定义形式:

29、私有继承的派生类定义形式: class class 派生类名:派生类名:private private 基类名基类名 派生类新成员定义;派生类新成员定义; ; ;private:protected:public:基类?派生类v基类成员基类成员:在派生类中的访问属性都变成在派生类中的访问属性都变成 private。v派生类的成员函数派生类的成员函数: 可以访问基类的公有成员和保护成员,不能访问基可以访问基类的公有成员和保护成员,不能访问基类的私有成员类的私有成员;v派生类以外的其它函数派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任不能通过派生类的对象,访问从基类继承的任何成员。何

30、成员。privateprivateprivate派生类成员函数可以访问基类成员的属性private派生类对象36vprivateprivate是定义私有继承方式的关键字是定义私有继承方式的关键字v以以私有继承方式私有继承方式定义的派生类,继承了基类中可以继承的成定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员,这些成员在派生类中的员:公有成员、保护成员和私有成员,这些成员在派生类中的访问属性都是访问属性都是私有的私有的。v派生类的成员函数派生类的成员函数可以访问基类的公有成员和保护成员,可以访问基类的公有成员和保护成员,不不能访问能访问基类的基类的私有成员私有成员。v派生

31、类以外的其它函数派生类以外的其它函数则则不能不能通过派生类的对象通过派生类的对象访问从基类访问从基类继承的任何成员继承的任何成员。 8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系37class 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;8.2.3 8.2.3

32、访问控制和继承关系访问控制和继承关系38class 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 yOff) Point:Move(xOff,yOff);float GetX() return Point:GetX();float GetY() return Point:GetY();float G

33、etH() return H;float GetW() return W;private:/新增私有数据新增私有数据float W,H;派生类中的派生类中的 成员函数成员函数 可以直接访问基类中可以直接访问基类中的的publicpublic和和protectedprotected成员,但成员,但不能访问基不能访问基类的类的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确39class Rectangle: private Point/派生类声明派生类声明public:/新增外部接口新增外部接口void InitR(float x, f

34、loat 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;派生类中的派生类中的 成员函数成员函数 可以直接访问基类中的可以直接访问基类中的publicpublic和和pr

35、otectedprotected成员成员,但不能访问基类的但不能访问基类的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误40class 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 8.2.3 访问控制

36、和继承关系访问控制和继承关系41class Rectangle: private Point/派生类声明派生类声明public:/新增外部接口新增外部接口void InitR(float 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(

37、) return W;private:/新增私有数据新增私有数据float W,H;8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确42main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?l使用派生类的使用派生类的 对象对象 不能不能访问基类中的任何成员访问基类中的任何成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误错误错误433. 3. 保护继承保护继承 保护继承的派生类定义形式:保护继承的派生类定义形式: class class 派生类名:派生类名:protectedprotected

38、 基类名基类名 派生类新成员定义;派生类新成员定义; ; ;private:protected:public:基类?派生类v基类成员:基类成员:公有成员和保护成员在派生类中变成保护类型的,基类的私公有成员和保护成员在派生类中变成保护类型的,基类的私有成员属性不变。有成员属性不变。v派生类的成员函数派生类的成员函数:可以访问基类的公有成员和保护成员,不能访问基可以访问基类的公有成员和保护成员,不能访问基类的私有成员类的私有成员;v派生类以外的其它函数派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任不能通过派生类的对象,访问从基类继承的任何成员。何成员。privateprotecte

39、dprotected派生类成员函数可以访问基类成员的属性prot-ected派生类对象44vprotectedprotected是定义保护继承方式的关键字是定义保护继承方式的关键字v 以以保护继承方式保护继承方式定义的派生类,继承了基类中可以继承的成定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员。其中基类的员:公有成员、保护成员和私有成员。其中基类的公有成员公有成员和保护成员和保护成员在派生类中访问控制属性变成在派生类中访问控制属性变成保护类型的保护类型的,基类,基类的的私有成员私有成员保持保持原来属性原来属性。v 派生类的成员函数派生类的成员函数可以访问基类的公有成员

40、和保护成员,可以访问基类的公有成员和保护成员,不不能访问能访问基类的基类的私有成员私有成员。v 派生类以外的其它函数派生类以外的其它函数则则不能不能通过派生类的对象通过派生类的对象访问访问从基类从基类继承的继承的任何成员任何成员。 8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系45class 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; flo

41、at GetY() return Y;private: float X,Y;8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系46class Rectangle: protected Point/派生类声明派生类声明public:/新增外部接口新增外部接口void InitR(float x, float y, float w, float h)InitP(x,y);W=w;H=h;/?派生类访问基类公有成员派生类访问基类公有成员void Move(float xOff, float yOff) Point:Move(xOff,yOff);float GetX() return Po

42、int:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:/新增私有数据新增私有数据float W,H;派生类中的派生类中的 成员函数成员函数 可以直接访问基类中可以直接访问基类中的的publicpublic和和protectedprotected成员,成员,但不能访问基但不能访问基类的类的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确47class Rectangle: protected Poin

43、t /派生类声明派生类声明public: /新增外部接口新增外部接口void InitR(float 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;

44、派生类中的派生类中的 成员函数成员函数 可以直接访问基类中的可以直接访问基类中的publicpublic和和protectedprotected成员成员,但不能访问基类的但不能访问基类的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误48class 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; fl

45、oat GetY() return Y;protected: float X,Y;8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系49class Rectangle: protected Point /派生类声明派生类声明public: /新增外部接口新增外部接口void InitR(float 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

46、 GetY() return Point:GetY();float GetH() return H;float GetW() return W;private: /新增私有数据新增私有数据float W,H;派生类中的派生类中的 成员函数成员函数 可以直接访问基类中的可以直接访问基类中的publicpublic和和protectedprotected成员成员,但不能访问基类的但不能访问基类的privateprivate成员。成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系正确正确50main() Rectangle rect; coutrect.X; /? coutrect.

47、GetX();/?l使用派生类的使用派生类的 对象对象 不能访问基类中的任不能访问基类中的任何成员。何成员。8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系错误错误错误错误51私有继承和保护继承的区别私有继承和保护继承的区别private:protected:public:父类privateprotectedprotected子类protectedprivate:protected:public:父类privateprivateprivate:子类privateprivateprivateprivate:孙类privateprotectedpublic孙类成员函数无法访问孙类成员函

48、数无法访问protectedpublicprivateprotectedprotected孙类孙类成员函数可以访问孙类成员函数可以访问52public:protected:private:publicpublicprotectedprivateprotectedprotectedprotectedprivateprivateprivateprivateprivate基类存取方式继承类型派生类继承的基类成员的访问属性8.2.3 8.2.3 访问控制和继承关系访问控制和继承关系53v派生类派生类修改修改基类的成员,是在派生类中声明了一个基类的成员,是在派生类中声明了一个与基类成员与基类成员同名同名

49、的新成员的新成员。v在派生类作用域内或者在类外通过派生类的对象直在派生类作用域内或者在类外通过派生类的对象直接使用这个成员名,只能访问到派生类中声明的同接使用这个成员名,只能访问到派生类中声明的同名新成员,这个新成员覆盖了从基类继承的同名成名新成员,这个新成员覆盖了从基类继承的同名成员,这种情况称为员,这种情况称为同名覆盖同名覆盖。 8.2.4 8.2.4 同名覆盖同名覆盖54class base public: void f () coutbaseendl; ;class deriver: public base public: void f () coutderiverendl; ;int

50、 main( ) deriver derobj; derobj.f (); return 0;输出结果输出结果?A: baseB: deriver在在派生类中声明了一个中声明了一个与基类成员同名的新成员的新成员只能访问到派生只能访问到派生类中的同名新类中的同名新成员成员在派生类作用域内派生类作用域内或者在类外类外通过派生类的对象直接使用这个成员名8.2.4 8.2.4 同名覆盖同名覆盖55同名覆盖示例同名覆盖示例 #includeusing namespace std;class base public: void function()coutfunction of class baseend

51、l; ;class deriver: public base public: void function()coutfunction of class deriverendl; ;v 同名的新成员。同名的新成员。v 同名覆盖。同名覆盖。56void main() deriver derobj; derobj.function();输出结果输出结果:function of class deriver同名覆盖示例同名覆盖示例 57第第8 8章章 继承与派生继承与派生8.1 8.1 继承的概念继承的概念8.2 8.2 定义基类和派生类定义基类和派生类8.3 8.3 构造函数和析构函数构造函数和析构函

52、数8.4 8.4 转换与继承转换与继承588.3 8.3 派生类构造函数和析构函数派生类构造函数和析构函数v派生类派生类继承了基类中继承了基类中除构造函数和析构函数除构造函数和析构函数之外之外的所有成员。的所有成员。v基类的构造函数和析构函数不能被派生类所继承基类的构造函数和析构函数不能被派生类所继承; ;v派生类一般需要定义自己的构造函数和析构函数派生类一般需要定义自己的构造函数和析构函数; ;v派生类的构造及析构函数通常会受到基类构造及派生类的构造及析构函数通常会受到基类构造及析构函数的影响。析构函数的影响。598.3.1 8.3.1 基类只有基类只有无参数无参数的构造函数的构造函数v在基

53、类具有在基类具有无参构造函数无参构造函数,派生类又,派生类又没有定义构造没有定义构造函数函数的时候,系统会的时候,系统会自动的调用基类无参构造函数自动的调用基类无参构造函数,来构造派生类对象中的基类成分。来构造派生类对象中的基类成分。60#includeusing namespace std;class base private: int m_data;public: void SetData(int data)m_data=data; int GetData()return m_data;使用系统提供的默认构造函数使用系统提供的默认构造函数61class deriver:public bas

54、eprivate: int m_member;public: void SetMember(int m) m_member=m; int GetMember()return m_member;使用系统提供的默认构造函数使用系统提供的默认构造函数62void main() int n(10); deriver obj; obj.SetMember(n); coutobj.GetMember()endl;输出结果:输出结果:10使用系统提供的默认构造函数使用系统提供的默认构造函数638.3.1 8.3.1 基类只有基类只有无参数无参数的构造函数的构造函数v如果基类如果基类没有无参没有无参构造函数,

55、派生类也构造函数,派生类也不定义不定义自己自己的构造函数,在的构造函数,在编译编译的时候,一定会的时候,一定会有语法错误有语法错误。64v如果基类和对象数据成员的如果基类和对象数据成员的构造函数都无参数构造函数都无参数,派生类构造函数派生类构造函数形参表中将形参表中将只包含只包含用于初始化它用于初始化它自己的自己的基本类型数据成员的参数基本类型数据成员的参数。v如果这个如果这个派生类派生类恰好恰好没有没有基本类型的数据成员,基本类型的数据成员,则其构造函数的形参表为空,则其构造函数的形参表为空,可以不定义构造函可以不定义构造函数,而使用系统提供的默认构造函数。数,而使用系统提供的默认构造函数。

56、 8.3.1 8.3.1 基类只有无参数的构造函数基类只有无参数的构造函数658 8.3.3.2 .2 派生类的构造函数派生类的构造函数v不参与继承的特殊函数不参与继承的特殊函数 构造函数构造函数 析构函数析构函数 作为特权地位的友元函数作为特权地位的友元函数 赋值运算符函数赋值运算符函数v派生类需要自己定义的构造函数和析构函数。派生类需要自己定义的构造函数和析构函数。66v基类的构造函数不被继承,需要在派生类中自行定基类的构造函数不被继承,需要在派生类中自行定义义 。v派生类的构造函数完成:派生类的构造函数完成: 初始化初始化本类本类的数据成员;的数据成员; 完成派生类中完成派生类中基类成分

57、基类成分的初始化:通过调用基类的构造的初始化:通过调用基类的构造函数,并为基类的构造函数传递参数;函数,并为基类的构造函数传递参数; 如果数据成员有对象,则需调用对象成员的构造函数;如果数据成员有对象,则需调用对象成员的构造函数;8 8.3.3.2 .2 派生类的构造函数派生类的构造函数67v派生类的构造函数:派生类的构造函数: 构造函数构造函数参数表参数表中以中以合适的初值为参数,初始化合适的初值为参数,初始化本类中本类中新增成员新增成员。 利用利用成员初始化表成员初始化表隐含调用隐含调用基类基类和和新增对象数据成员新增对象数据成员的的构造函数,初始化它们各自的数据成员。构造函数,初始化它们

58、各自的数据成员。v构造函数的调用次序构造函数的调用次序 系统会使用系统会使用派生类构造函数的形参表的参数派生类构造函数的形参表的参数调用调用基类基类和和内嵌对象成员的构造函数内嵌对象成员的构造函数。 8 8.3.3.2 .2 派生类的构造函数派生类的构造函数68v派生类构造函数的一般形式派生类构造函数的一般形式: : 派生类名派生类名: :派生类名派生类名( (基类所需的形参,本类成员所需基类所需的形参,本类成员所需的形参的形参) ): :基类基类1( 1(基类参数表基类参数表1), 1), , ,基类基类n(n(基类参数表基类参数表n),n),对象成员对象成员1( 1(对象参数表对象参数表1

59、), 1), , ,对象成员对象成员m(m(对象参数表对象参数表m)m) 本类基本类型数据成员初始化;本类基本类型数据成员初始化; 8.3.2 8.3.2 派生类构造函数派生类构造函数初始化列表69v单继承时的构造函数单继承时的构造函数 派生类名派生类名: :派生类名派生类名( (基类所需的形参,本类成员所需的形参基类所需的形参,本类成员所需的形参) ): :基基类名类名( (参数参数) ) 本类成员初始化赋值语句;本类成员初始化赋值语句; 8.3.2 8.3.2 派生类构造函数派生类构造函数70例例8-4 8-4 单继承派生类构造函数单继承派生类构造函数71v多文件结构:多文件结构: 主函数

60、:主函数:ch8_4_main().cppch8_4_main().cpp 类类TShapeTShape的声明:的声明:TShape04.hTShape04.h 类类TShapeTShape的实现:的实现:TShape04.cppTShape04.cpp 类类TEllipseTEllipse的声明:的声明:TEllipse04.hTEllipse04.h 类类TEllipseTEllipse的实现:的实现:TEllipse04.cppTEllipse04.cpp例例8-4 8-4 单继承派生类构造函数单继承派生类构造函数72/TShape04.cpp/TShape04.cpp#include

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论