Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章

上传人:E**** 文档编号:89363105 上传时间:2019-05-24 格式:PPT 页数:106 大小:561.50KB
返回 下载 相关 举报
Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章_第1页
第1页 / 共106页
Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章_第2页
第2页 / 共106页
Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章_第3页
第3页 / 共106页
Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章_第4页
第4页 / 共106页
Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章_第5页
第5页 / 共106页
点击查看更多>>
资源描述

《Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章》由会员分享,可在线阅读,更多相关《Visual C++基础教程 教学课件 ppt 作者 郭文平 第1-6章 第4章(106页珍藏版)》请在金锄头文库上搜索。

1、第4章 继承和派生类,4.1 基类和派生类 4.2 继承方式 4.3 派生类的构造函数和析构函数 4.4 多重继承 4.5 虚基类 4.6 赋值兼容规则 习题,4.1 基类和派生类 4.1.1 继承 在现实世界中,对于既有共同特征又有细小差别的事物,人们一般采用层次分类的方法来描述它们之间的关系。例如,图4-1是一个食品的分类图。,图4-1 简单的食品分类图,在这个分类树中建立了一个层次结构,最高层是抽象程度最高的,是最具有普遍和一般意义的概念,下层具有了上层的特征,同时加入了自己的新特征。从上往下看,每一层都比上一层更具体。例如,苹果拥有水果的所有特征,水果拥有食品的特征,同时,苹果又具有区

2、别于其它水果的特征。这样,在描述苹果时就不需要描述它所具有的食品和水果的特征,只需要描述它特有的特征。 图4-1体现了现实世界中的继承关系。所谓继承,就是从先辈处得到属性和行为特征。在面向对象程序设计中,继承就是一个新类可以从现有类获得特征,从现有类产生新类的过程就是类的派生。现有的用来派生新类的类称为基类或父类,由现有类派生出来的新类称为派生类或子类。,在类的派生过程中,派生出来的派生类也可以作为基类来继续派生新的类。此外,一个基类可以派生出多个派生类,这样就形成了类的层次结构。在类的层次结构中,直接派生出派生类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。 在C+语言中,有两

3、种继承:单一继承和多重继承。一个派生类只有一个直接基类,则该继承称为单一继承。图4-1的继承关系就是一个单一继承。一个派生类有多个直接基类,则该继承称为多重继承。例如,图4-2所示的继承是多重继承关系。,图4-2 多重继承示意图,4.1.2 派生类的定义 首先介绍单一继承。在C+中,单一继承派生类的定义格式如下: class 派生类名:继承方式 基类名 派生类新增加的数据成员和成员函数说明 ; 其中,“基类名”必须是已经存在的类的名称;“派生类名”则是新建的类的名称;“继承方式”决定了基类成员在派生类中的访问控制权限。继承方式也称为派生方式,分为三种:private、protected和pub

4、lic,分别表示私有继承、保护继承和公有继承。如果定义派生类时没有指定继承方式,系统缺省为private(私有继承)。,下面举例说明派生类的定义。在第3章中,我们定义了Point类,它代表屏幕上的一个点。现在需要定义代表屏幕上矩形的类Rectangle。对于屏幕上的矩形,当确定了其左上角的坐标和长宽后,矩形就唯一确定了,因此, Rectangle类中包含Point类中的成员,可以通过继承来实现。一般地,屏幕坐标原点位于左上角,水平方向坐标向右为正,垂直坐标向下为正。,【例4.1】 派生类的定义示例。 #include class Point private: int x,y; public:

5、void SetPoint(int a,int b) x=a;y=b; int GetX() return x; ,int GetY() return y; void Move(int offsetx,int offsety) x=x+offsetx; y=y+offsety; ;,class Rectangle:public Point private: /新增私有数据成员 int w,h; public: /新增公有成员函数 void SetRect(int x,int y,int a,int b) SetPoint(x,y); /调用基类成员函数设置左上角坐标 w=a;h=b; int

6、GetW() return w; int GetH() return h; ;,void main() Rectangle rect; rect.SetRect(5,8,30,40); rect.Move(3,2); cout“the left-top coordinate:(“rect.GetX(),rect.GetY()endl; cout“the width of rectangle:“rect.GetW()endl; cout“the height of rectangle:“rect.GetH()endl; 程序运行结果为: the left-top coordinate:(8,10

7、) the width of rectangle:30 the height of rectangle:40,在派生类Rectangle中继承了基类Point的所有成员(缺省的构造函数和析构函数除外),同时还根据需要又增加了自己的数据成员和成员函数,因此,派生类Rectangle实际拥有的成员包括从基类继承来的成员和新增加的成员。在程序中,通过派生类的对象访问了成员函数Move()、GetX()和GetY(),而实际上访问的是从基类继承来的成员函数。这样,通过继承,就实现了代码的重用。,4.1.3 派生类对基类的扩充 面向对象程序设计的继承机制的主要目的是实现程序代码的重用和扩充。派生类一经定

8、义,就继承了基类除构造函数和析构函数外的所有成员,实现了代码的重用。派生类是基类的子类,必然具有某些与基类不同的属性和行为,这就需要对基类进行调整、改造和扩充。这种调整、改造和扩充主要体现在两个方面:一是增加新的成员;二是对基类成员进行改造。,1. 派生类对基类的扩充 在派生类中增加新成员是实现派生类在功能上扩展的手段。在定义派生类时,根据需要,可在派生类中适当添加新的数据成员和成员函数,使派生类具有新的功能。另外,基类的构造函数和析构函数不能被派生类继承,因此对基类成员的初始化和程序结束时的清理工作,需要在派生类中加入新的构造函数和析构函数。 例如,在例4.1中,派生类Rectangle在基

9、类Point的基础上增加了数据成员w和h,用来描述矩形的属性长和宽,同时,为了获得矩形的长宽属性,新增了GetH()和GetW()两个成员函数。通过这些新增的成员,类Rectangle在基类Point的基础上具有了新的功能。,2. 派生类对基类成员的改造 派生类可以继承基类除构造函数和析构函数外的所有成员,部分继承过来的成员有可能在访问权限和功能上不能满足派生类的要求,此时就需要对基类成员进行改造。这种改造包括两个方面:一是改变基类成员的访问权限,这通过在定义派生类时的继承方式来控制;二是派生类可以对基类的数据成员和成员函数重新定义,即在派生类中定义与基类成员同名的数据成员或成员函数。由于作用

10、域不同,派生类的成员覆盖了与基类同名的成员。对于成员函数,如果基类成员函数与派生类成员函数的函数名相同,参数也相同,则派生类的成员函数覆盖基类的同名成员函数,当参数不同时,即构成函数重载。,4.2.1 基类成员在派生类中的访问属性 基类成员可以有public(公有)、private(私有)和protected(保护)三种访问属性,基类自身的成员可以对基类中任何一个其它成员进行访问,但是通过基类的对象只能访问该类的公有成员。 当派生类继承了基类的成员后,基类中具有不同访问属性的成员由于继承方式不同,因而在派生类中的访问属性也有所不同。表4-1列出了基类成员在派生类中的访问属性。,4.2 继 承

11、方 式,表4-1 基类成员在派生类中的访问属性,从表4-1中可以看出: (1) 公有继承(public)方式:基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,而基类的私有成员在派生类中不可访问。 (2) 保护继承(protected)方式:基类中的公有成员和保护成员在派生类中都变成保护成员,而基类的私有成员在派生类中不可访问。 (3) 私有继承(private)方式:基类中的公有成员和保护成员在派生类中都变成私有成员,而基类的私有成员在派生类中不可访问。 因此,无论哪种继承方式,基类中的私有成员在派生类中都不允许访问,基类中的公有成员和保护成员都可以被派生类中的成员直接访问。,4

12、.2.2 派生类对象对基类成员的访问 1. 保护继承 在类定义中,在关键字protected下说明的成员称为保护成员。保护成员既具有私有的特性又具有公有的特性。,类中的保护成员与私有成员一样,不允许在类的外部通过类的对象进行访问,因此,保护成员具有私有的特性。例如: class base protected: int i; ; void fun() base b; b.i=20; /错,类的对象不能访问类的保护成员 ,因此,在非继承关系下,类的保护成员等同于私有成员。C+中提供保护成员主要用于类的继承关系中。 在派生类中,派生类的成员函数可以直接访问基类的保护成员,因此,保护成员又具有公有的特

13、性。注意,即使在派生类中也不能通过基类的对象访问基类的保护成员。 【例4.2】 保护成员使用示例。 #include class base protected: int i; ;,class derived:public base public: void fun() base b; b.i=20;/错误,不能通过对象访问类的保护成员 void seti(int a) i=a;/正确,派生类中可以直接访问基类的保护成员 ; void main() derived d; d.seti(5); d.fun(); ,2. 公有继承 在公有继承方式下,基类中的公有成员和保护成员在派生类中仍然是公有成员

14、和保护成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象只能访问基类的公有成员,不能访问基类的保护成员和私有成员。 3. 私有继承 在私有继承方式下,基类中的公有成员和保护成员在派生类中都变成私有成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象不能访问基类的任何成员。,【例4.3】 继承方式对基类成员访问属性的影响示例。 #include class Base /定义基类Base private: int x; protected: int y; public: void SetX(int a) x=a; void SetY(int a) y=a; void Sh

15、owX() cout“x=“x; void ShowY() cout“y=“y; ;,class Derived1:public Base /定义派生类Derived1,从基类Base公有继承 private: int d1; public: void SetDerived1(int da,int db,int dc) x=da; /错误 y=db; /正确 d1=dc; void Showd1() cout“d1=“d1; ;,class Derived2:protected Base /定义派生类Derived2,从基类Base保护继承 private: int d2; public: v

16、oid SetDerived2(int da,int db,int dc) x=da; /错误 y=db; /正确 d2=dc; void Showd2() cout“d2=“d2; ;,class Derived3:private Base /定义派生类Derived3,从基类Base私有继承 private: int d3; public: void SetDerived3(int da,int db,int dc) x=da; /错误 y=db; /正确 d3=dc; void Showd3() cout“d3=“d3; ;,class Dederived1:public Derived1 /定义派生类Dederived1 public: void Sho

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

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

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