C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章 派生类与继承

上传人:E**** 文档编号:89383237 上传时间:2019-05-24 格式:PPT 页数:39 大小:225.50KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章  派生类与继承_第1页
第1页 / 共39页
C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章  派生类与继承_第2页
第2页 / 共39页
C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章  派生类与继承_第3页
第3页 / 共39页
C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章  派生类与继承_第4页
第4页 / 共39页
C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章  派生类与继承_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章 派生类与继承》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 陈维兴 等 第5章 派生类与继承(39页珍藏版)》请在金锄头文库上搜索。

1、第5章 派生类与继承,5.1 继承与派生类,5.1.1 为什么要使用继承,class person protected: char name10; int age; char sex; public: void print(); ;,class employee protected: char name10; int age; char sex; char department20; float salary; public: print(); ;,5.1.2 派生类的声明,/定义一个基类 class person protected: char name10; int age; char s

2、ex; public: / ; /定义一个派生类 class employee:public person protected: char department20; float salary; public: / ;,声明一个派生类的一般格式为: class 派生类名:继承方式 基类名 /派生类新增的数据成员和成员函数 ;,由类person继承出类employee可以采用下面的三种格式之一: (1) 公有继承 class employee:public person / ; (2) 私有继承 class employee:private person / ; (3) 保护继承 class e

3、mployee:protected person / ;,从已有类派生出新类时,可以在派生类内完成以下几种功能: (1) 可以增加新的数据成员; (2) 可以增加新的成员函数; (3) 可以重新定义基类中已有的成员函数; (4) 可以改变现有成员的属性。,5-1-3 基类成员在派生类中的访问属性,5.1.4 派生类对基类成员的访问规则,派生类对基类成员的访问形式主要有以下两种: (1) 内部访问: 由派生类中新增成员对基类继承来的成员的访问。 (2) 对象访问: 在派生类外部,通过派生类的对象对从基类继承来的成员的访问。,1. 私有继承的访问规则 当类的继承方式为私有继承时,基类的public

4、成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。 基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。 例5.1一个私有继承的例子,表5-2 私有继承的访问规则,2. 公有继承的访问规则 当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问

5、它们。但是,类的外部使用者只能通过派生类的对象访问继承来的public成员。 基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。 例5.3 公有继承的访问规则,表5-3 公有继承的访问规则,3. 保护继承的访问规则 当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。 基类的privat

6、e成员在私有派生类中是不 可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的private成员。 例5.4 保护继承的访问规则。,表5-4 保护继承的访问规则,5.2 派生类的构造函数和析构函数,5.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数; 当撤消派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。,例5.5 基类和派生类的构造函数及析构函数的执行顺序。 #include class Base public: Base() cout“Constructing base

7、 classn“; /基类的构造函数 Base() cout“Destructing baes classn“; /基类的析构函数 ; class Derive:public Base public: Derive()cout“Constructing derived classn“; /派生类的构造函数 Derive()cout“Destructing derived classn“; /派生类的析构函数 ; main() Derive op; return 0; ,5.2.2 派生类构造函数和析构函数的构造规则,在C+中,派生类构造函数的一般格式为: 派生类名(参数总表):基类名(参数表)

8、 / 派生类新增成员的初始化语句 ,例5.6 当基类含有带参数的构造函数时, 派生类构造函数的构造方法。 #include class Base public: Base(int n) /基类的构造函数 cout“Constructing base classn“; i=n; Base() /基类的析构函数 cout“Destructing base classn“; void showi() coutiendl; private: int i; ;,class Derive :public Base public: Derive(int n,int m):Base(m) / 定义派生类构造函

9、数时, / 缀上基类的构造函数 cout“Constructing derived class“endl; j=n; Derive() /派生类的析构函数 cout“Destructing derived class“endl; void showj() coutjendl; private: int j; ; main() Derive obj(50,60); obj.showi(); obj.showj(); return 0; ,当派生类中含有内嵌对象成员时,其构造函数的一般形式为: 派生类名(参数总表):基类名(参数表1),内嵌对象名1(内嵌对象参数表1),内嵌对象名n(内嵌对象参数表

10、n) / 派生类新增成员的初始化语句 ,在定义派生类对象时,构造函数的执行顺序如下: 调用基类的构造函数; 调用内嵌对象成员的构造函数(有多个对象成员时,调用顺序由它们在类中声明的顺序确定); 派生类的构造函数体中的内容 撤消对象时,析构函数的调用顺序与构造函数的调用顺序正好相反。,5.4 多继承,派生类只有一个基类,这种派生方法称为单基派生或单继承。 当一个派生类具有多个基类时,这种派生方法称为多基派生或多继承。,5.4.1 多继承的声明,有两个以上基类的派生类声明的一般形式如下: class 派生类名:继承方式1 基类名1,继承方式n 基类名n / 派生类新增的数据成员和成员函数 ;,5.

11、4.2 多继承的构造函数与析构函数,多继承构造函数定义的一般形式如下: 派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),基类名n(参数表n) / 派生类新增成员的初始化语句 ,5.4.3 虚基类,1. 为什么要引入虚基类,例5.14 虚基类的引例。 #include class base public: base() a=5; cout“base a=“aendl; protected: int a; ; class base1:public base public: base1() a=a+10; cout“base1 a=“aendl; ; class base2:pub

12、lic base public: base2()a=a+20; cout“base2 a=“aendl; ;,class derived:public base1,public base2 public: derived() cout“base1:a=“base1:aendl; cout“base2:a=“base2:aendl; ; main() derived obj; return 0; 程序运行结果如下:: base a=5 base1 a=15 base a=5 base2 a=25 base1:a=15 base2:a=25,base base base1 base2 derive

13、d 图5-2 非虚基类的类层次图,2. 虚基类的概念,虚基类的声明是在派生类的声明过程,其语法形式如下: class 派生类名:virtual 继承方式 类名 / ,例5-15 虚基类的使用。 #include class base public: base( ) a=5; cout“base a=“aendl; protected: int a; ; class base1: virtual public base public: base1( ) a=a+10; cout“base1 a=“aendl; ; class base2: virtual public base public:

14、base2( ) a=a+20; cout“base2 a=“aendl; ;,class derived:public base1,public base2 public: derived( ) cout“derived a=“aendl; ; main( ) derived obj; return 0; 程序运行结果如下:: base a=5 base1 a=15 base2 a=35 derived a=35,base base1 base2 derived 图5-3 虚基类的类层次图,3. 虚基类的初始化,在使用虚基类机制时应该注意以下几点: (1) 如果在虚基类中定义有带形参的构造函

15、数,并且没有定义缺省形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。 (2) 建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用都自动被忽略。,(3) 若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类构造函数; (4) 对于多个虚基类,构造函数的执行顺序仍然是先左后右,自上而下; (5) 对于非虚基类,构造函数的执行顺序仍是先左后右,自上而下; (6) 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。,5.5 赋值兼容规则,所谓赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。这样,公有派生类实际上就具备了基类的所有特性,凡基类能解决的问题,公有派生类也能解决。,例如,下面声明的两个类: class Base ; cl

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

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

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