C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第17章

上传人:E**** 文档编号:89350106 上传时间:2019-05-23 格式:PPT 页数:97 大小:320.50KB
返回 下载 相关 举报
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第17章_第1页
第1页 / 共97页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第17章_第2页
第2页 / 共97页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第17章_第3页
第3页 / 共97页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第17章_第4页
第4页 / 共97页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第17章_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第17章》由会员分享,可在线阅读,更多相关《C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第17章(97页珍藏版)》请在金锄头文库上搜索。

1、第17章 类 的 继 承,17.1 继承 17.2 继承机制中的初始化 17.3 多重继承 17.4 虚基类,面向对象的程序设计方法提供了这样一种机制,即一个类可以从另一个类获得部分或全部属性。把这种机制称为继承(inheritance)。前者称为子类(child class)或派生类(derived class),后者称为父类(parent class)或基类(base class)。 面向对象技术的这个重要机制,为程序代码的重用提供了一个有效的手段,并且使程序更易于维护和扩充。,17.1 继 承,17.1.1 继承与派生类 类的继承与派生概念反映了客观世界中事物一般与特殊的关系,上下的层次

2、关系,抽象与具体的关系。基类是派生类的抽象描述,派生类是基类的特例。从编程技术的角度看,继承机制提供了代码重用的手段。 从一个基类派生叫做单继承,从多个基类派生叫做多重继承。本节介绍单继承。 从已有的类(基类)派生出一个新类(派生类)的定义格式是:,class 派生类名 : 继承方式 基类名 private: 派生类新成员 protected: 派生类新成员 public: 派生类新成员 ;,继承方式用于规定基类成员在派生类中的访问权限,因此继承方式又称为访问控制或访问方式。 访问控制使用关键字public说明时,称为公有继承或公有派生。访问控制使用关键字private说明时,称为私有继承或私

3、有派生。如果继承方式说明被省略,则隐含为private。 引入继承与派生的概念后,在类的成员中,出现了一种新的类成员:protected成员,称为保护成员。,17.1.2 公有派生 公有派生也称为公有继承。在公有派生的情况下,派生类可以访问基类中的公有和保护成员,不能访问基类的私有成员。也就是说,基类的public成员和protected成员分别继承为派生类的public成员和protected成员。派生类的成员可以直接访问它们。在派生类的外部只能通过派生类的对象访问基类的public成员。,例17.1.1 从类point(点)公有派生类circle(圆)。 首先,定义一个类point,它有两

4、个私有数据成员:点的横坐标x和纵坐标y。三个公有的成员函数,用于操作数据成员x和y。类point的定义如下:,class point private: int x; int y; public: void set_point(int a,int b); int get_x(void); int get_y(void); ;,我们用这个类派生出一个类circle。其数据成员为圆的半径。因为,圆除了半径还需要一个点作为自己的圆心,而类“point”中已经有了这方面内容,所以,可以把类“point”作为基类,加以继承。于是定义类circle(圆)如下:,class circle : public p

5、oint private: int radius; public: int get_radius(void); void set_radius(int num); void show(void); ;,这个例子选用public方式派生,所以,基类的所有public成员,就好像在circle类中说明过一样。当然,派生类中的成员函数不能访问基类的私有部分。如果把类point中的private改为protected,则派生类就能访问它们了。这就是说,protected成员可以被继承。 现在利用上面定义的基类point和派生类circle,编写主程序,实现定义和输出一个圆的功能。程序利用基类point

6、的数据作为圆的圆心。派生类circle定义圆的半径。,程序如下: #include class point /定义基类point private: int x; int y; public: void set_point(int a,int b) x=a; y=b; ,int get_x(void) return x; int get_y(void) return y; ; class circle :public point /定义公有派生类circle private: int radius; public: void set_radius(int num) radius=num; ,in

7、t get_r(void) return radius; void show_circle(int a,int b,int c; ; void show_circle(int a,int b,int c) cout“The center of a circle: (“a“,“b“)“endl; cout“The radius of a circle: “cendl; ,main() class circle c; /定义派生类对象c c.set_point(10,10); /对象c访问继承基类的成员函数 c.set_radius(5); /为对象c的半径赋值 c.show_circle(c.g

8、et_x(),c.get_y(),c.get_r(); /输出对象c return 0; ,17.1.3 私有派生 当派生类采用私有继承方式(关键字为private)时,即为私有派生。这时,基类的所有public成员和protected成员被继承为派生类的private成员。派生类的成员可以把它们作为自己私有成员来访问。在派生类之外无法通过派生类的对象访问它们。派生类不能继承基类的private成员。,例17.1.2 将例17.1.1程序的公有继承改为私有继承。 将例17.1.1程序的公有继承改为私有继承后,原来主函数中的语句 c.set_point(10,10); c.show_circle

9、(c.get_x(),c.get_y(),c.get_r(); 都是不合法的了。因此,对例17.1.1的程序应做以下几点修改:,(1)将基类的私有数据成员改为protected成员; (2)在派生类中增加访问基类数据的功能:函数set_xy(); (3)修改派生类的成员函数show_circle()以及主函数的相应修改。,程序如下: #include class point /定义基类point protected: int x; int y; public:,void set_point(int a,int b) x=a; y=b; int get_x(void)return x; int

10、get_y(void) return y; ; class circle :private point /定义私有继承派生类circle private: int radius; public:,void set_radius(int num) radius=num; int get_r(void) return radius; void set_xy(int a,int b) x=a;y=b; void show_circle(int c) ,cout“The center of a circle: (“ get_x()“,“get_y()“)“endl; cout“The radius o

11、f a circle: “cendl; ; main() ,class circle c; c.set_xy(20,20); c.set_radius(15); c.show_circle(c.get_r(); return 0; 现将不同继承方式下派生类的访问权限归纳如表17.1.1所示。,表17.1.1,基类的构造函数和析构函数是不能继承的。如果对从基类派生来的成员初始化,还必须由基类的构造函数来完成。所以,派生类的构造函数,一方面负责自己成员的初始化,另一方面还要负责调用基类的构造函数,向基类构造函数传送为初始化所必要的参数。 基类和派生类构造函数执行的顺序是,系统首先调用基类的构造函数

12、,然后,调用用派生类的构造函数。系统执行析构函数的次序正好相反。,17.2 继承机制中的初始化,17.2.1 不带参数的基类构造函数 在基类构造函数不带参数的情况下,问题比较简单。让我们通过一个简单的例子和它的输出来观察初始化的实现过程。 例17.2.1 继承机制中初始化数据成员例子。 有基类A和公有派生类B。派生类B访问基类A的数据i和j并进行加法运算。两个类中,都给出了构造函数和析构函数,以便观察它们的调用过程。基类的构造函数将数据成员初始化为:i=1;j=2。,程序如下: #include class A /定义基类A protected: int i, j; public: A(voi

13、d); A(void) cout“destroyed A“endl; ;,class B:public A /定义公有继承的派生类B private: int b; public: int get_sum(void); B(void); B(void) cout“destroyed B“endl; ;,A:A(void) /基类构造函数 i=1; j=2; cout“created An“; B:B(void) /派生类构造函数 b=5; cout“created Bn“;, int B:get_sum(void) return i+j+a; main() B b; /定义派生类对象,调用构造

14、函数 coutb.get_sum()“n“; /计算数并输出据成员的和 return 0;, 程序的输出为: created A created B 8 destroyed B destroyed A,如果在基类中没有定义构造函数,系统将调用基类的默认的构造函数。 我们看到,在执行派生类的构造函数前,先要执行基类的构造函数,然后,执行派生类的构造函数。析构函数执行的顺序则相反。,17.2.2 带参数的基类构造函数 为把参数传递给基类,就要在派生类构造函数后面,对这些参数加以说明。派生类构造函数定义的一般形式为: 派生类名:派生类构造函数名(参数表):基类构造函数名(参数表) ,下面通过具体的例

15、子来说明。 例17.2.2 程序中定义有基类Rectangle和由它公有派生出来的类Cube。基类Rectangle有protected数据成员rect_x和rect_y。 派生类Cube通过自己的构造函数,将参数x和y传递给基类Rectangl的数据成员rect_x和rect_y。这时,派生类的构造函数,应有如下的形式: Cube:Cube(float x,float y, float h):Rectangle(x,y) , 主程序中,在定义派生类Cube的对象c时,派生类的构造函数将相关参数传递给基类的构造函数。对象c使用成员函数cube()操作基类Rectangle的数据并输出结果。 程序如下:,#include class Rectangle /定义基类Rectangle protected: float rect_x; float rect_y; public: Rectangle(float x, float y); /带参数基类构造函数原型 Rectangle() cout“destroed Rctangle.“endl; ,float area() return rect_x*rect_y; ; Rectangle:Rectangle(float x, float y) /定义基类构造函数 rect_x=x; rect_y=y; cout“initial

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

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

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