概念介绍与派生类的声明
- 格式:docx
- 大小:19.96 KB
- 文档页数:2
C++ 基类和派生类9/4/2001 8:37:5· ·--··本讲讨论基类和派生类的基本概念。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。
所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。
我们称已存在的用来派生新类的类为基类,又称为父类。
由已存在的类派生出的新类称为派生类,又称为子类。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。
派生类的定义格式单继承的定义格式如下:class <派生类名>:<继承方式><基类名>{<派生类新定义成员>};其中,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。
<继承方式>常使用如下三种关键字给予表示:public 表示公有基类;private 表示私有基类;protected 表示保护基类;多继承的定义格式如下:class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…{<派生类新定义成员>};可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个。
派生类的三种继承方式公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。
1. 公有继承(public)公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
2. 私有继承(private)私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
派生类的定义和使用
派生类的定义和使用
派生类是通过从一个已有的类(被称为基类)派生而来的新类。
派生类也可称作“子类”,基类也可称作“父类”,它们之间存在着一种“从属”关系。
派生类可以保留基类的所有功能,并且可以在基类的基础上增加新的特性和功能,从而实现新的功能。
派生类通常具有两个特点:(1)它可以从基类继承成员变量;(2)它可以重新实现基类的方法,即重写基类的方法。
使用派生类的一般步骤如下:
1. 定义基类:首先定义一个基类,该类中包括必需的成员,如成员变量、构造函数和成员函数。
2. 定义派生类:定义派生类时,往往会使用基类中的成员变量和成员函数,它可以使用基类的构造函数,也可以定义自己的构造函数。
3. 使用派生类:派生类的成员变量和成员函数,可以像使用基类一样使用,也可以通过多态(即重写基类的方法)实现多态性。
派生类的一个重要作用是将复杂的问题细分为若干简单的子问题,从而提高程序的可维护性和可扩展性。
派生类也是典型的面向对象编程(OOP)的重要技术,它可以大大简化大型复杂的程序编写过程。
- 1 -。
继承与派生类1 知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
2 典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
2019景德镇教师招聘考试:相关类属vs派生类属原因就是同学们掌握二者概念的时候,很多人都是用例子来记住概念,而不是用例子去理解概念。
在这里纠正同学们一个错误的认识,就是例子仅仅是一种特殊情况,他应该是被概念所包含,而不应该与概念等同。
所以想要对相关类属和派生类属更深刻的理解,还是需要各位同学认真理解其概念。
在这里为同学们提供了两个不同权威教材中对两个概念的表述和解释,希望能帮助同学们作出区分。
陈琦、刘儒德《当代教育心理学》中这样论述:下位学习可以分为两种形式,一种是派生类属,即新学习内容仅仅是学生已有的、包容面较广的命题的一个例证,或是能从已有命题中直接派生出来的。
例如,知道了“长方形的四个顶角都是直角”,而正方形是长方形的一种特例,那就很容易理解“正方形的四个顶角都是直角”。
另一种是相关类属,即新内容纳入可以扩展、修饰或限定学生已有的概念、命题,并使其精确化。
例如,学生学习了“杠杆”的概念,知道了杠杆的力臂原理,而后他们学习滑轮,知道定滑轮实质上是一种等臂杠杆,这就把“定滑轮”同化到了“杠杆”之下,但学生对杠杆的理解也会有一定变化:杠杆并不一定是一根细长的,它也可以是一个圆轮子。
在皮连生《教育心理学》中有这样的描述:在下位学习或类属学习中,需要区分两种不同的类属过程。
第一,派生类属过程。
当新的学习材料作为原先获得的概念的特例,或作为原先获得的命题的证据或例证而加以解释时,便产生了派生类属学习。
在上述两种情形中,所要学习的新材料可以直接从认知结构中原有的具有更高包容性和概括性的概念或命题中推衍出来,或者蕴含在其中,也就是说,新知识只是旧知识的派生物。
在这样的条件下,派生材料的意义出现很快,学习比较省力。
例如,若学生在学习正方形、长方形、三角形时已形成轴对称图形概念。
在学习圆时,“圆也是轴对称图形”这一命题被纳入或类属于原有轴对称图形概念,新的命题很快就获得意义,学生立即能发现圆具有轴对称图形的一切特征。
继承一.概念:继承允许在已有类的基础上创建新的类,新类可以从已有类中继承函数和数据,而且可以重新定义或加进新的数据与函数,从而形成类的层次或等级,其中,已有类称为基类或父类,在他基础上新建的类称为派生类或子类。
二.为什么使用继承:所谓继承就是从先辈处得到的属性或行为。
类的继承就是从已有类那里得到已有的特征,从里一个角度,从已有类产生新类的过程就是类的派生,类的继承和派生机制使程序员无需再修改已有类,只需在已有类的基础上,通过增加少量代码或修改少量代码的方法得到新的类。
从而形成类的层次结构。
关键字protected,将相关的数据成员说明为保护成员,可以被本类的成员函数访问,也可以被本类的派生类的成员函数访问,而类以外的任何访问都是非法的。
三.派生类的声明:声明一个派生类的一般格式为Class 派生类名:[继承方式] 基类名{派生类新增的数据成员和成员函数};其中,继承方式有共有继承(public)私有继承(private)和保护继承(protected).默认的方式为私有继承。
四.派生类的构成;构造一个派生类一般需要下面三个基本步骤;(1)派生类从基类接受成员;把基类中的全部的成员接受过来(除了构造函数和析构函数)(2)调整从基类接受来的成员;派生类不能对从基类接受来的成员进行选择,但是可以对这些成员进行调整,这主要包括两个方面,一是改变某些基类成员在派生类中的访问属性(通过派生类声明时的继承方式来控制)。
另一类是派生类可以对基类的成员进行重定义,即在派生类中声明一个和基类成员同名的成员,以实现对基类成员的覆盖。
(3)在派生类中增加新的成员。
五.基类成员在派生类中的访问属性类的继承方式有public,protected,private三种,不同的继承方式导致不同访问属性的基类成员在派生类的访问属性也不相同。
按方式可划分为4种:不可直接访问,共有,私有,和保护。
六.派生类对基类的访问规则:基类的成员可以有公有,私有,保护三种访问属性,基类的成员函数可以访问基类中的其他成员,但在类外,通过基类的对象则只能访问该基类的公有成员。
一.继承与派生的概念
在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。
但是面向对象设计中代码的复用性和扩展性还没有体现出来。
对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。
类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。
下图说明了某个公司雇员的派生关系。
位于最高层的雇员其抽象程度最高,是最具一般性的概念。
最下层抽象程度最低,最具体。
从上层到下层是具体化的过程,从下层到上层是抽象话的过程。
面向对象设计中上层与下层是基类与派生类的关系。
我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。
每个雇员都有姓名、级别和薪水等信息。
每种雇员都可以升级,但升级方式不同。
他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。
这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。
但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等
我们应该先描述所有雇员的共性,再分别描述每类雇员。
分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。
这种描述方法在面向对象设计中就是类的继承与派生。
对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。
类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。
这两个概念是两个相对的方向上的。
由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。
已有类叫做基类或者父类,产生的新类叫做派生类或者子类。
派生类同样又可以作为基类派生新的子类,这样就形成了类的层次结构。
二.派生类的声明
派生类声明的语法形式为:
class 派生类名: 继承方式1 基类名1, 继承方式2 基类名2, ... 继承方式n 基类名n
{
派生类成员的声明;
}
例如,类Parent1和Parent2是已经声明过的类,类Child是由这两个类派生出的子类,则声明Child类的基本形式为:
class Child : public Parent1, private Parent2
{
public:
Child();
~Child();
}
“基类名”(Parent1和Parent2)是已有类的名称,“派生类名”(Child)是从已有类产生的新类的名称。
从上面的例子可以看到,一个派生类可以有多个基类,这叫做多继承。
这种情况下派生类就同时具有多个基类的特性。
一个派生类如果只有一个基类,则叫做单继承。
我们在软件开发中用的最多的就是单继承,也就是一个派生类只有一个基类。
同样,一个基类也可以产生多个派生类,这比多继承更常见。
基类产生派生类,派生类又可以作为基类再派生它自己的派生类,任何基类又可以产生多个派生类,这样就形成了一个类族。
直接派生出某个类的基类叫做这个类的直接基类,基类的基类或者更高层的基类叫做派生类的间接基类。
例如,类A派生出类B,类B派生出类C,则类A是类B的直接基类,类B是类C的直接基类,而类A是类C的间接基类。
我们在声明派生类时,除了要指明基类,还要指定继承方式。
继承方式限定了派生类访问从基类继承来的成员的方式,指出了派生类成员或类外的对象对从基类继承来的成员的访问权限。
每个“继承方式”只限定紧随其后的基类。
继承方式有:公有继承、保护继承和私有继承,分别对应的关键字是public、protected和private。
如果没有显式指定继承方式,则默认为私有继承。
上面的例子中Child类继承Parent1类是公有继承,继承Parent2类是私有继承。
关于继承方式的详细说明鸡啄米后面很快会讲。
派生类声明语法形式中的派生类成员指除了原封不动从基类中继承来的成员以外,修改的基类成员或者新增加的成员。
派生类成员是对基类的扩展。
从基类继承产生派生类实现了对代码的复用,派生类中修改的基类成员或新增加的成员实现了对代码的扩展。
这样继承与派生使得我们减少了重复性劳动,提高了软件开发效率,维护和扩展程序更容易。