《继承与派生类》ppt课件

上传人:tian****1990 文档编号:75747547 上传时间:2019-02-01 格式:PPT 页数:36 大小:202.96KB
返回 下载 相关 举报
《继承与派生类》ppt课件_第1页
第1页 / 共36页
《继承与派生类》ppt课件_第2页
第2页 / 共36页
《继承与派生类》ppt课件_第3页
第3页 / 共36页
《继承与派生类》ppt课件_第4页
第4页 / 共36页
《继承与派生类》ppt课件_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《《继承与派生类》ppt课件》由会员分享,可在线阅读,更多相关《《继承与派生类》ppt课件(36页珍藏版)》请在金锄头文库上搜索。

1、第五章 继承与派生类,本章主要内容 5.1 派生类的概念 5.2 派生类的构造函数和析构函数 5.3 多重继承 5.4 赋值兼容规则 本章重点 派生类的构造函数和析构函数及它们的执行顺序 本章难点 派生类的构造函数的定义格式以及多继承的构造函数的定义 本章所需学时: 4 学时,继承是面向对象程序设计的基本特征之一,是从已有的类基础上建立新类。继承性是面向对象程序设计支持代码重用的重要机制。面向对象程序设计的继承机制提供了无限重复利用程序资源的一种途径。通过C+语言中的继承机制,一个新类既可以共享另一个类的操作和数据,也可以在新类中定义已有类中没有的成员,这样就能大大的节省程序开发的时间和资源。

2、,class UStudent public: void print() coutnumberendl; coutnameendl; coutscoreendl; coutmajorendl; protected: int number; string name; float score; String major; ;,为什么要使用继承 class Student public:. void print() coutnumberendl; coutnameendl; coutscoreendl; protected: int number; string name; float score;

3、 ;,5.1 继承与派生类,继承是类之间定义的一种重要关系。定义类UStudent继承类Student时,自动得到类Student的操作和数据属性,使得程序员只需定义类Student中所没有的新成分就可完成在类UStudent的定义,这样称类UStudent继承了类Student ,类Student派生了类UStudent , Student是基类(父类), UStudent是派生类(子类)。这种机制称为继承。 称已存在用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。派生类可以具有基类的特性,共享基类的成员函数,使用基类的数据成员,还可以定义自己的新特性,定

4、义自己的数据成员和成员函数。 在C+语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。,派生类的声明 单继承的定义格式如下: class : public: /派生类新定义成员 members; members; members; 是新定义的一个类的名字,它是从中派生的,并且按指定的派生的。 有以下几种形式: public:表示公有继承; private:表示私有继承,可默认声明; protected :表示保护继承,派生类除了可以从基类继承成员外,还可以增加自己的数据成员和成员函数。这些新增的成员正是派生类不同于基类的

5、关键所在,是派生类对基类的发展。 从已有类派生出新类时,可以在派生类内完成以下几种功能: 可以增加新的数据成员。 可以增加新的成员函数。 可以重新定义基类中已有的成员函数。 可以改变现有成员的属性。,基类成员在派生类中的访问属性 基类中的私有成员 无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接访问的。 基类中的公有成员 当类的继承方式为公有继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现的。 当类的继承方式为私有继承时,基类中的所有公有成员在派生类中都是以私有成员的身份出现的。 当类的继承方式为保护继承时,基类中的所有公有成员在派生类中都是以保护成员的身

6、份出现的。,基类中的保护成员 当类的继承方式为公有继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。 当类的继承方式为私有继承时,基类中的所有保护成员在派生类中都是以私有成员的身份出现的。 当类的继承方式为保护继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。,派生类对基类成员的访问规则 派生类对基类成员的访问形式主要有以下两种: 内部访问:由派生类中新增成员对基类继承来的成员的访问。 对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。,下面具体讨论在3种继承方式下,派生类对基类成员的访问规则。 私有继承的访问规则 当类的继承方式为私有继承时,基类

7、的 public成员和 protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通 过派生类的对象,都无法直接访问基类的private成员,但是可以通过基类提供的 public成员函数间接访问。 例题分析:5.1,公有继承的访问规则 当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和 protected成员,派生类的其他成员可以直接访问他们。但是,类的外部使用者只能通

8、过派生类的对象访问继承来的pllblic成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。 例题分析:5.3,保护继承的访问规则 当类的继承方式为保护继承时,基类的public成员和protected成员,派生类的其他成员可以直接访问它们,但是在类外使用不能通过派生类的对象来访问它们。基类的private成员在保护派生类中是不可直接访问的。 例题分析:5.4,5.2派生类的构造函数与析构函数,构造函数 由于构造函数不能够被继承,C+提供一

9、种机制,使得在创建派生类对象时,能够调用基类的构造函数来初始化基类数据。也就是说,派生类的构造函数必须通过调用基类的构造函数来初始化基类对象 。所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。 父类构造函数的执行时机:定义构造子类对象时,在子类对象调用构造函数时,在子类构造函数的第一条语句前插入一条调用父类构造函数的语句,以完成对父类继承的成员的初始化操作。并且父类数据的初始值必须由子类构造函数的成员初始化列表给出。如子类构造函数中没有给出序列初始化列表,则调用父类的默认构造函数。,派生类构造函数与析构函数的执行顺序 通常情

10、况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤消派生类对象时,则先执行派生类的折构函数,随后再执行基类的析构函数。 例题分析:5.5,派生类构造函数和析构函数的构造规则 当基类的构造函数没有参数,或没有显式定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数 派生类不能继承基类中的构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。 在C+中,派生类的构造函数的一般格式为: 派生类名() :基类构造函数(),子对象名(),子对象名 ( ;,派生类构造函数的调用顺序如下: (1)调用基类

11、的构造函数,调用顺序按照它们继承时说明的顺序。 (2)调用子对象类的构造函数,调用顺序按照它们在类中说明的顺序。 (3)派生类构造函数体中的内容。 例题分析:5.7,说明 派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当然,基类中没有定义构造函数,派生类根本不必负责调用基类构造函数 当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数途径。在有的情况下,派生类构造函数体可能为空,仅起到参数传递作用如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的构造 由于析构函数是不带参数

12、的,在派生类中是否定义析构函数与它所属基类无关,基类的析构函数不会因为派生类没有析构函数而得不到执行,它们是各自独立的。 下面例子5.8来说明派生类的构造函数与析构函数的构造规则,#include class First int a,b; public: First()a=0;b=0; First(int x,int y)a=x;b=y; First() void print() cout“n a=“a“ b=“b; class Second:public First int c,d; public: Second():First(1,1)c=0;d=0; Second(int x,int y

13、):First(x+1,y+1) c=x;d=y; Second(int x,int y,int m,int n):First(m,n) c=x;d=y; Second() void print() First:print(); cout“ c=“c“ d=“d;,class Third:public Second int e; public: Third()e=0; Third(int x,int y,int z):Second(x,y) e=z; Third(int x,int y,int z,int m,int n):Second(x,y,m,n) e=z; Third() void p

14、rint() Second:print();cout“ e=“e;,main() First obj0; obj0.print(); Second obj1; obj1.print(); Second obj2(10,10,20,20); obj2.print(); Second obj3(10,10); obj3.print(); Third obj4; obj4.print(); Third obj5(10,10,20); obj5.print(); Third obj6(100,100,200,50,50); obj6.print(); return 0;,在派生类中声明的名字支配基类中

15、声明的同名的名字,即如果在派生类的成员函数中直接使用该名字的话,则表示使用派生类中声明的名字,而不是基类中声明的名字,如: class X public: int f(); class Y:public X public: int f(); int g();; void Y:g() f( );/X:f( );,5.3 调整基类成员在派生类中的访问属性,访问声明 我们已经知道,对于公有继承,基类的公有成员函数也就是派生类的公有成员函数,这意味着外界可以用派生类的对象调用基类的公有成员函数。但是对于私有继承,基类的公有成员函数变成了派生类的私有成员函数了。这时,外界就无法利用派生类的对象直接调用基

16、类的成员函数,而只能通过调用派生类的成员函数(内含调用基类成员函数的语句)间接地调用基类的成员函数。,#include class A int y; public: A(int x1) x=x1; void print() cout“x=“x; ; class B:private A int y; public: B(int x1,int y1):A(x1)y=y1; void print1()print(); main() B b(10,20); b.print1(); return 0;,上述方法虽然执行起来比较简单,但在实际应用中却可能带来不便。有时程序员可能希望基类A的个别成员还能被派生类的对象直接访问,而不是通过派生类的公有成员函数间接 访问。为此,C+提供了称为访问声明的特殊机制,可个别调整基类的某些成员,使之在派生类中

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

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

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