继承性和派生类
- 格式:ppt
- 大小:790.00 KB
- 文档页数:16
1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。
继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。
它使得某类对象可以继承另外一类对象的特征和能力。
继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。
通过继承方式定义的子类也称为派生类。
2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。
对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。
表5.1列出了不同继承方式下基类成员访问属性的变化情况。
表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。
其余单元格内容为基类成员在派生类中的访问属性。
从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。
在同一类中私有成员和保护成员的用法完全一样。
3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。
具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。
保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。
这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
继承与派生类知识要点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分析:一个派生类可以作为另一个派生类的基类。
继承与派⽣:派⽣类对基类成员的访问控制之保护继承与私有继承(转)鸡啄⽶在编程⼊门系列上⼀节中讲了,这⼀节接着讲剩下的两种继承⽅式:保护继承和私有继承。
⼀.保护继承在保护继承⽅式中,基类的公有成员和保护成员被派⽣类继承后变成派⽣类的保护成员,⽽基类的私有成员在派⽣类中不能访问。
因为基类的公有成员和保护成员在派⽣类中都成了保护成员,所以派⽣类的新增成员可以直接访问基类的公有成员和保护成员,⽽派⽣类的对象不能访问它们,上⼀讲鸡啄⽶说过,类的对象也是处于类外的,不能访问类的保护成员。
对基类的私有成员,派⽣类的新增成员函数和派⽣类对象都不能访问。
通过上述保护继承的讲解,相信⼤家对类的有更加深刻的理解了。
假设A类是基类,B类是从A类继承的派⽣类,A类中有保护成员,则对派⽣类B来说,A类中的保护成员和公有成员的访问权限是⼀样的。
⽽对A类的对象的使⽤者来说,A类中的保护成员和私有成员都⼀样不能访问。
可见类中的保护成员可以被派⽣类访问,但是不能被类的外部对象(包括该类的对象、⼀般函数、其他类等)访问。
我们可以利⽤保护成员的这个特性,在软件开发中充分考虑数据隐藏和共享的结合,很好的实现代码的复⽤性和扩展性。
鸡啄⽶举个简单的例⼦讨论下保护成员的访问属性。
class Base{protected:int x; // 基类的保护成员};int main(){Base base;base.x = 0; // 编译报错return0;}这段代码在编译的时候会报错,错误就出在通过对象base访问保护成员x时,就像上⾯讲的,对Base类的对象base的使⽤者来说,Base 类中的保护成员x和私有成员的访问特性是⼀样的,所以对象base不能访问x,这样跟使⽤私有成员⼀样通过保护成员实现了数据的隐藏。
class Base{protected:int x; // 基类的保护成员};class Child : public Base{public:void InitX();};void Child::InitX(){x = 0;}对上⾯的派⽣类Child来说,基类Base中的保护成员x和公有成员的访问权限⼀样,所以Child类的成员函数InitX可以访问Base类的保护成员x。
类的具体概念类是面向对象编程中的一种概念,用于描述具有相似属性和行为的对象的集合。
类是构建对象的蓝图或模板,它定义了对象的属性和方法,并为对象提供了一些通用的行为模式。
在现实世界中,我们可以把类比作是一个工厂,它生产同一类型的产品,每一个具体的产品就是类的实例。
比如说,我们可以创建一个“动物”类,它有属性(如年龄、体重、颜色等)和行为(如吃、睡、行走等)。
然后,我们可以利用这个动物类创建各种具体的动物实例,如狗、猫、鸟等。
类的概念具有以下几个特点:1. 抽象性:类是对一组具有相似特征和行为的对象的抽象描述。
它抓住了这些对象相同的特征和行为,忽略了它们之间的细节差异。
例如,当我们定义一个“车辆”类时,我们不关心具体的车辆是什么样子,只关心它们有轮子、引擎和驾驶的能力。
2. 封装性:类通过将数据和操作封装在一起,提供了一种控制对内部数据和方法的访问的机制。
它隐藏了对象的内部细节,只暴露出一些对外的接口,用于操作对象。
这样一来,对象的使用者只需要知道如何使用这些接口,而不需要关心具体的实现细节。
封装提高了代码的可维护性和可读性,并且降低了代码的耦合性。
3. 继承性:继承是类的一个重要的特性,它允许我们定义一个类,并从已有的类中派生出新的类,从而实现类的层次结构。
被继承的类称为基类或父类,新派生出的类称为子类或派生类。
子类可以继承父类的属性和方法,并且可以重写父类的方法或添加新的属性和方法。
继承提供了代码重用的机制,允许我们构建更加复杂和灵活的系统。
4. 多态性:多态是指在不同的情况下,相同的操作可以以不同的方式被执行。
多态可以通过继承和接口实现,它允许我们使用继承层次中的任意一个类的实例来执行特定的操作,而不需要关心实际的类型。
例如,如果有一个“A动物”类和一个“B动物”类,它们都继承自“动物”类,那么我们可以以相同的方式调用它们的"吃"方法,但是具体的实现会根据不同的动物而有所不同。