第7章 继承性和派生类
- 格式:doc
- 大小:535.50 KB
- 文档页数:34
派⽣类与继承.⼀、引⼊继承的⽬的1. 代码重⽤类的继承和派⽣机制,使程序员⽆需修改已有类,只需在已有类的基础上,通过增加少量代码或修改少量代码的⽅法得到新的类,从⽽较好地解决了代码重⽤的问题。
2. 代码的扩充只有在派⽣类中通过添加新的成员,加⼊新的功能,类的派⽣才有实际意义。
⼆、派⽣类的声明格式(单继承)[cpp]1. class 派⽣类名:继承⽅式基类名2.3. {4.5. //派⽣类新增的数据成员和成员函数6.7. };class 派⽣类名:继承⽅式基类名{//派⽣类新增的数据成员和成员函数};1)基类名是⼀个已经定义的类的名字,也可称为⽗类;2)派⽣类名是继承原有类的特性⽽⽣成的新类的名称;3)继承⽅式规定了如何访问从基类继承的成员,指定了派⽣类成员以及对象对于基类继承来的成员的访问权限,它包括关键字private、protected、public(分别表⽰私有、保护、公有继承)。
4)如果不显⽰地给出继承⽅式关键字,系统默认为私有继承(private)。
三、基类成员在派⽣类中的访问属性1. 从基类成员属性看1)当基类成员在基类中的访问属性为private时,在三种继承⽅式的派⽣类中的访问属性都不可直接访问;2)当基类成员在基类中的访问属性为public时,继承⽅式为public,在派⽣类中的访问属性为public,继承⽅式为private,在派⽣类中的访问属性为private,继承⽅式为protected,在派⽣类中的访问属性为protected;3)当基类成员在基类中的访问属性为protected时,继承⽅式为public,在派⽣类中的访问属性为protected,继承⽅式为private,在派⽣类中的访问属性为private,继承⽅式为protected,在派⽣类中的访问属性为protected。
基类成员在基类中访问属性基类成员在派⽣类中访问属性public private protectedpublic public private protected private不可直接访问不可直接访问不可直接访问protected protected private protected2. 从继承⽅式看1)当继承⽅式为private时,基类成员属性为public和protected,则在派⽣类中的访问属性为private,基类成员属性为private,则在派⽣类中的访问属性为不可直接访问;2)当继承⽅式为public时,基类成员属性为public和protected,则在派⽣类中的访问属性为不变,基类成员属性为private,则在派⽣类中的访问属性为不可直接访问;3)当继承⽅式为protected时,基类成员属性为public和protected,则在派⽣类中的访问属性为protected,基类成员属性为private,则在派⽣类中的访问属性为不可直接访问。
继承性与派生类9.1 继承性与派生类的基本概念继承是软件复用的一种形式,它是从现有类的基础上建立新类,新类继承了现有类的属性和方法,并且还拥有其特有的属性和方法。
继承的过程称为派生,新建的类为派生类(或子类),原有的类称为基类(或父类)。
继承可分为:单继承和多重继承。
若派生类只有一个基类则称为单继承;若派生类有多个基类则称为多重继承。
9.2 派生类的声明与访问权限9.2.1 派生类的声明单继承中派生类的定义格式为:class <派生类名>:<派生方式><基类名>{派生类新定义的成员声明;};说明:①派生方式关键字为private、public和protected,分别表示私有继承、公有继承和保护继承。
缺省的继承方式是私有继承。
继承方式规定了派生类成员和类外对象访问基类成员的权限。
②派生类新定义的成员是指继承过程中新增加的数据成员和成员函数。
通过在派生类中新增加成员实现功能的扩充。
9.2.2 派生类的访问权限公有继承(public)①继承后基类的公有成员、私有成员、保护成员在派生类中访问权限保持不变。
②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
③在基类和派生类定义以外只能通过派生类的对象访问基类的公有成员,无法通过派生类对象直接访问基类的私有成员和保护成员。
私有继承(private)①继承后基类的所有成员在派生类中均为私有成员。
②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
③在基类和派生类定义以外对基类的所有成员均无法直接访问也无法通过派生类的对象间接访问。
保护继承(protected)①继承后基类的公有成员和保护成员在派生类中均为保护成员,基类的私有成员在派生类中仍为私有成员。
②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
继承和派生的作用继承和派生是面向对象编程中常用的两个概念,它们在软件开发中起着重要的作用。
继承是指一个类从另一个类继承属性和方法的过程,派生是指在继承的基础上创建新的类的过程。
本文将分别介绍继承和派生的作用。
一、继承的作用1. 代码复用:通过继承,子类可以继承父类的属性和方法,避免了重复编写相同代码的麻烦。
这样可以提高代码的复用性,减少了代码量,提高了开发效率。
2. 继承关系的表达:通过继承,可以清晰地表达类与类之间的关系。
子类继承了父类的属性和方法,说明它们之间有某种联系,有共同的特征或行为。
3. 扩展功能:通过继承,子类可以在父类的基础上新增或修改属性和方法,实现功能的扩展。
这样可以满足不同的需求,增加了代码的灵活性。
4. 统一接口:通过继承,可以定义一个抽象的父类,然后定义多个子类来实现具体的功能。
这样可以实现统一的接口,使代码更加规范和易于管理。
5. 多态性的实现:继承是实现多态性的基础。
子类可以替代父类的位置,通过父类的引用来调用子类的方法。
这样可以实现动态绑定,提高了代码的灵活性和可扩展性。
二、派生的作用1. 创建新的类:派生是在继承的基础上创建新的类的过程。
通过派生,可以基于已有的类创建新的类,并在新的类中添加、修改或重新实现属性和方法。
2. 特化和泛化:通过派生,可以根据具体的需求创建特定的类。
例如,可以从一个通用的动物类派生出狗类和猫类,使它们具有更具体的属性和方法。
同时,也可以从一个具体的类派生出一个更通用的类,使它具有更广泛的适用性。
3. 继承关系的传递:通过派生,可以传递继承关系。
即子类可以继续被其他类所派生,形成更深层次的继承关系。
这样可以实现更复杂的类之间的继承和关联。
4. 重载和重写:通过派生,可以重载和重写父类的方法。
重载是指在子类中定义一个与父类同名但参数列表不同的方法,以实现不同的功能。
重写是指在子类中重新定义一个与父类同名同参数列表的方法,以实现不同的行为。
1、下列对基类和派生类关系的描述中,错误的是_________。
A)派生类是基类的具体化B)派生类是基类的子集C)派生类是基类定义的延续D)派生类是基类的组合2、继承具有_________ ,即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。
A)规律性B)传递性C)重复性D)多样性3、下面_________的叙述不符合赋值兼容规则。
A)派生类的对象可以赋值给基类的对象B)基类的对象可以赋值给派生类的对象C)派生类的对象可以初始化基类的引用D)派生类的对象的地址可以赋值给指向基类的指针5、下面叙述错误的是_________。
A)派生类可以使用private派生B)对基类成员的访问必须是无二义性的C)基类成员的访问能力在派生类中维持不变D)赋值兼容规则也适用于多继承的组合6、下列说法中错误的是_________。
A)公有继承时基类中的public成员在派生类中仍是public的B)公有继承时基类中的private成员在派生类中仍是private的C)私有继承时基类中的public成员在派生类中是private的D)保护继承时基类中的public成员在派生类中是protected的7、C++的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过_________派生出新的类。
A)复用B)继承C)封装D)引用8、下列关于虚基类的描述中,错误的是_________。
A)虚基类子对象的初始化由最派生类完成B)虚基类子对象的初始化次数与虚基类下面的派生类个数有关C)设置虚基类的目的是消除二义性D)带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函数的调用9、派生类的构造函数的成员初始化列表中,不能包含_________。
A)基类的构造函数B)派生类中子对象的初始化C)基类中子对象的初始化D)派生类中一般数据成员的初始化10、C++类体系中,不能被派生类继承的有_________。
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。