第4章C++派生类与继承

上传人:枫** 文档编号:552455001 上传时间:2023-03-28 格式:DOCX 页数:107 大小:294.73KB
返回 下载 相关 举报
第4章C++派生类与继承_第1页
第1页 / 共107页
第4章C++派生类与继承_第2页
第2页 / 共107页
第4章C++派生类与继承_第3页
第3页 / 共107页
第4章C++派生类与继承_第4页
第4页 / 共107页
第4章C++派生类与继承_第5页
第5页 / 共107页
点击查看更多>>
资源描述

《第4章C++派生类与继承》由会员分享,可在线阅读,更多相关《第4章C++派生类与继承(107页珍藏版)》请在金锄头文库上搜索。

1、C+面向对象程序设计教程(二版)讲稿第4章派生类与继承(书P111)一、派生类的概念(书P111)1、继承概念和派生类的引入在现实世界中,许多实体或概念不是孤立的,它们具有共同的特征,但也有差别。人们常使用层次分类的方法来描述这些实体或概念之间的相似点。例如(书P111)图4.1在这个分类树中建立一个层次结构,最高层是最普遍,最一般的,抽象的。以下一层比一层更具体,低层含有高层的特性,也与高层有细微的不同。例如,汽车有轮子,运输汽车有载重的设备,到了客车不必再提它有轮子及载C+4章_P1重设备,但客车载人与货车载货就有区别等等。客车从运输车派生出来,运输车从汽车派生。所以客车继承汽车的一般特性

2、。在面向对象程序设计中,继承是针对类而言,类可以从另一个类中继承特性。在C+中,一个类是从另一个类继承特性,称为派生出一个类,这个类称为派生类。而被继承的类称为基类。2、类继承的目的在OOP程序设计中,类继承有什么好处?如果有一个程序员接到公司分配一个任务“为公司人事管理程序增加一个功能,把只适用于普通职工的人事记录扩展为可适用于管理人员”。完成此任务,程序员有两种途径可以实现:(1)把原来设计的类全部推倒重来,按照新的要求重新设置类的私有和公有数据成员和成员函数。这样做风险很大,一旦修改过程有错,不仅无法实现新增类的功能,原来的功能也可能无法恢复。公司人事系统受到破坏。(2)另一种办法是,在

3、原有人事系统类中生成一个派生类,派生类可以继承基类的特性。例如,管理人员也有普通职工的姓名、性别等特性字段,可以继承下来。然后再扩充一些普通职工没有的特性。例如,管理人员的职别。这样C+4章_P2基类保证了公司原有的程序功能继续运作。把新的功能加入到派生类中。在调试阶段只需针对新增进去的功能调试派生类。一但调试成功,就可以全面使用派生类工作,而不影响原有程序的运行。既可防止出错造成无法恢复的危险,更可以缩短扩充程序的调试时间。继承性是C+同C之间最大区别之一。继承机制允许类从一个或多个简单的普通的类中继承其特性和行为,允许根据需要进行更具体的定义。派生类提供了继承的基础,并为裁剪基类提供了一种

4、手段。C+允许派生类继承或修改基类的部分或全部属性,并可以增加基类中没有的新的属性(包括数据成员和成员函数)以满足派生类的需要。3、单一继承和多继承在第1章已讲过,单一继承即派生类只继承一个基类,是从一个基类派生出来的。而多继承则派生类继承多个基类。是从多个基类派生出来的。4、派生类定义格式先讲单一继承的派生类。class派生类名:访问权限指明符基类名(private:新增私有成员及其他public:新增公有成员及其他protected:新增保护成员及其他);其中,“访问权限指明符”,书中使用“继承方式”(i)访问权限是规定基类成员在派生类继承后,派生类成员及类外对象可访问的权限。访问权限指明

5、符(继承方式)有以下三种:private私有继承public公有继承protected继承(ii)口是默认(也称为缺省)即不出现访问权限指明符,此时对于类是私有的(即private)对于结构则是公有的(即是 public)o例如(书P113)下面定义各种继承方式的派生类(1)公有继承class employee : public person/-);(2)私有继承class employee : private person/-);(3)保护继承class employee : protected person (/-);(4)默认访问权限指明符 class employee : person

6、 /-);与(2)私有继承相同。派生类除了可以从基类继承成员外,还可以增加自己的数据成员和成员函数。这些新增的成员正是派生类不同于基类的关键所在,这是派生类对基类的发展。从已有类派生出新类时,可以在派生类内完成以下几种功能:(1)可以增加新的数据成员。(2)可以增加新的成员函数。(3)可以重新定义基类中已有的成员函数。(4)可以改变基类现有成员的属性。例4、例4_15、保护成员(书P112)基类中受保护成员除了可以被本类成员函数访问外,也可以被由本类派生出来的派生类成员直接访问。而类外任何访问都是非法的。为什么要引入成员?因为无论何种派生,基类的私有成员,派生类都是不能直接访问的。为了使派生类

7、能够访问基类的私有成员,可以有以下两种方法:(1)把私有成员公有化,就是定义在公有区,但这就破坏了数据隐藏和封装。(2)在基类提供公有函数来操作所需的私有数据。从而派生类可以通过基类公有函数操作基类私有数据,这样做成员函数冗长而低效。为了解决这个问题,C+引入保护成员,即用关键字 protected作为访问权限指明符,来指明对基类成员的访问权限。基类的保护成员只能由本类成员函数或由本类派生的派生类的成员函数可直接访问,其它的任何访问都是非法的。外部函数、甚至基类的对象也不能直接访问。这就维护了隐蔽性,不过对派生类是开放的。所以只能说是半隐蔽性。例4_4_1二、继承方式及基类成员在派生类中的访问

8、权限(属性)1、表4.1参考书PH4基类成员在派生类中的访问权限在基类中的访问权限继承方式在派生类中的访问权限privatepublic不口直接访问privateprivate不口直接访问privateprotected不可直接访问publicpublicpublic (公有)publicprivateprivate (私有)publicprotectedprotected (保护)protectedpublicprotected (保护)protectedprivateprivate (私有)protectedprotectedprotected (保护)从上表可归纳:(1)基类中的私有成员

9、无论哪种继承方式,基类中的私有成员不允许派生类继承。因此,派生类中是不可直接访问。(2)基类中的公有成员当继承是公有的,在派生类中仍是公有成员身份出现。基类成员访问权限在派生类中完全相同。当继承是私有的,基类公有成员在派生类中都以私有成员身份出现。当继承方式是保护的,基类公有成员在派生类中都以保“身份出现。(3)基类中的保护成员当继承是公有的,基类保护成员在派生类中仍是保护成员身份出现。当继承是私有的,基类保护成员在派生类中都以私有成员身份出现。当继承方式是保拧的,基类保护成员在派生类中仍以保护身份出现。2、派生类对基类成员的访问规则派生类对基类成员的访问形式主要有以下两种:(a)内部访问,由

10、派生类中新增成员对从基类继承来的成员的访问。(b)对象访问,在派生类外部通过派生类创建的对象对从基类继承来的成员的访问。下面讨论三种继承方式,派生类对基类成员的访问规则(1)公有继承(公有派生)的访问规则(a)基类的public和protected成员在派生类中仍作为public和 tectc 成员。(i)派生类内的成员可直接访问。(ii)在外部可通过派生类创建的对象访问public成员,但不能访问成员。(b)基类的private成员在公有派生中是不可直接访问。所以无论派生类成员还是通过派生类的对象都不能直接访问基类中的private成员。但可以通过基类提供的public 成员函数间接访问它们

11、例4.3(书 P119)ttinclude class base声明一1个基类base(private:int x ;protected:int y ;public:void setxy( int m , int n )基类定义成员函数 setxy x = m ;y = n ;)void showxyO基类定义成员函数showxy () cout x = x endl ;cout y = y endl ;);class derived : public base声明一个公有派生类(private:int z ;派生类新增私有数据成员public:void setxyz ( int m , in

12、t n , int 1)/派生类新增公有成员函数setxyz ()(setxy ( m , n );成员函数setxy()在派生类中是public成员,可以访问z =1;/,最后初始化派生类私有数据成员zvoid showxyz()派生类新增公有成员函数showxyz ()/cout *x =* x endl ;非法,基类base的私有数据成员x在派生类不能直接访问cout y = y endl ;正确,基类base的保护成员y在公有派生类是保护成员 cout z = z endl ;);main()(derived obj ;创建派生类对象objobj. setxyz(30,40,50);正

13、确,派生类对象直接访问公有成员函数setxyz() obj. showxyO ;正确,showxy ()函数在派生类derived中是public成员函数 obj. showxyz ();正确,showxyz()函数在派生类derived中是public成员函数return 0;程序的运行结果为:X =30y =40y =40z =50本例派生类成员函数showxyz ()中语句cout x =,z x endl ;是非法的,尽管派生类derived以公有方式从基类base派生,但基类base的私有数据成员x在派生类是不能直接访问的。要解决这问题,只能调用基类base公有函数 showxy (

14、) o用例4_3_1来实现include class base声明一个基类base(private:int x ;protected:int y ;public:void setxy( int m , int n )基类定义成员函数 setxyx = m ; y = n ;)void showxyO基类定义成员函数showxy ()cout x = x endl ;cout y = y endl ;);class derived : public base声明一公有派生类(private:int z ;派生类新增私有数据成员public:void setxyz( int m , int n , int 1)派生类新增公有成员函数setxyz ()setxy ( m , n );/成员函数setxy()在派生类中是public成员,可以访问Z = 1;/最后初始化派生类私有数据成员Z)void showxyz ()派生类新增公有成员函数showxyz ()showxy ():调用基类base的公有成员函数showxyO输出经x, y/cout x = x endl ;非法,基类base的私有数据成员x在派生类不能直接访问 cout

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

当前位置:首页 > 商业/管理/HR > 商业计划书

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