概念介绍与派生类的声明
- 格式: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种:不可直接访问,共有,私有,和保护。
六.派生类对基类的访问规则:基类的成员可以有公有,私有,保护三种访问属性,基类的成员函数可以访问基类中的其他成员,但在类外,通过基类的对象则只能访问该基类的公有成员。
5.2 基类和派生类在C++中,当一个类被其他类继承时,被继承的类称为基类(base class)。
继承其他类特性的类称为派生类(derived class)。
从本质上看,基类是具有一个类集合中的公共特性,派生类在继承基类特性的同时可以加入自己独有的特性。
基类与派生类之间反映出下述三种不同的现象:(1)派生类是基类的具体化。
即模拟概念层次,表示“is-a”的关系。
(2)派生类是基类的延迟定义。
可以定义一个抽象基类,定义一些操作,使它们服从一定的协议,但许多可能并未实现,然后定义非抽象的派类,实现抽象基类中定义的行为。
这时派生类不是基类的具体化,而是抽象类的实现。
在JA V A中,有专门的纯虚类,称为接口,其作用就是为不同的类提供一个统一的接口,同时间接实现多继承(JA V A不支持多继承)。
(3)派生类是基类的结合。
当一个派生类有多于一个的基类时,它们组合在一起形成具有所有基类行为的类型。
这时要注意,不要用继承表达聚合关系。
5.2.1 基类与派生类的说明先看一个例子。
[例5.1] 派生类的说明EX5_1.CPP。
继承基类的派生类定义的一般形式:class derived_class_name:access_specifier base_class_name{……};其中access_specifier可以是3个关键字之一:public、private(默认值)或protected。
派生类也称为子类、导出类。
它具有下述特点:(1)可在基类所提供有基础上包含新成员;(2)可在自己类中隐藏基类的任何成员;(3)为新类重新定义基类中的函数;[例5.2] 子类的特点EX5_2.CPP。
5.2.2 派生类的继承权与访问域派生类的继承权如果不能有效在加以限制,就不能按照实际情况表达求解问题的复杂性。
因此访问权限是一个很重要的问题。
(1)对于基类的私有成员,派生类及派生类的使用者无权访问。
(2)对于基类的公有成员,则按派生类的定义,分为三种情况:①私有派生,继承基类的公有成员作为自己的私有成员,这些成员只能被派生类的成员函数访问。
派生类属与相关类属概念一、基本概念在理解派生类属和相关类属之前,我们需要先回顾一个知识,就是在知识的学习的分类中,根据“新知识与原有认知结构的关系”,可以分为下位学习、上位学习、并列组合学习。
而在下位学习中,又细分为派生类属和相关类属。
派生类属:即新学习内容仅仅是学生已有的、包容面较广命题的一个例证,或是能直接从已有命题中直接派生出来。
相关类属:即新内容纳入可以扩展、修饰或限定学生已有的概念、命题,并使其精确化。
二、破题关键由上述知识的回顾我们不难发现,无论是派生类属和相关类属,都是下位学习,指将概括程度或包容范围较低的新概念或命题,归属到认知结构中原有的概括程度或包容范围较高的适当概念和命题之下,从而获得新概念或新命题的意义。
即“先学大概念,后学小概念”。
因此,遇到这类题目后,同学们要分两步第一步:确定是下位学习。
因为同学们要明确一个概念,就是无论“派生”还是“相关”都是下位学习,也就是新学习的内容一定是小概念。
第二步:记住一个非常好用的小口诀——“派生直接加例证,相关就要改结构”。
1刚才的知识回顾已经告诉我们,派生类属中,学习的新概念就是从原有的认知结构中直接派生出来,原有的认知结构没有改变,而相关类属是对原有的认知结构加以修饰,简单来说就是改变了原有的认知结构。
比如:同学们之前学习了挂国旗、唱国歌是爱国行为,今天学习了保护环境,发现保护环境也是爱国行为。
这道题中,首先大概念是爱国行为,小概念是保护环境,因此是下位学习;其次,同学们原来以为只有跟国家有关的事物才是爱国,保护环境是其他的行为,今天学习了之后发现原来爱国行为的范围这么广,也就是这次学习扩大了爱国行为的范围,改变了认知结构,因此这次学习属于相关类属。
2。
派生类的构造函数派生类是指从基类继承而来的子类,它们在继承基类的同时,可以增加自己的成员变量和成员函数。
在C++中,派生类的构造函数是一种特殊的函数,用于初始化派生类的对象。
本文将介绍派生类的构造函数的基本概念、特点和使用方法。
一、派生类的构造函数的基本概念派生类的构造函数是一种特殊的函数,它用于初始化派生类的对象。
它可以调用基类的构造函数来初始化基类的成员变量,也可以初始化派生类自己的成员变量。
派生类的构造函数必须在定义派生类时进行声明和定义。
在定义派生类的构造函数时,需要指定它所继承的基类的构造函数的调用方式。
如果不指定,编译器会默认调用基类的默认构造函数。
如果基类没有默认构造函数,那么编译器会报错。
派生类的构造函数和基类的构造函数一样,可以有多个,但是它们之间必须有不同的参数列表。
如果没有定义派生类的构造函数,那么编译器会自动生成一个默认的构造函数。
二、派生类的构造函数的特点1. 派生类的构造函数必须先调用基类的构造函数,再初始化自己的成员变量。
2. 如果派生类的构造函数没有显式地调用基类的构造函数,编译器会默认调用基类的默认构造函数。
3. 如果基类没有默认构造函数,那么派生类的构造函数必须显式地调用基类的构造函数,并且在参数列表中传递必要的参数值。
4. 派生类的构造函数可以调用基类的构造函数的任何一个版本,包括默认构造函数、拷贝构造函数和移动构造函数。
5. 派生类的构造函数可以覆盖基类的构造函数,但是必须保证派生类的构造函数与基类的构造函数的参数列表不同。
6. 派生类的构造函数可以调用自己的其他构造函数,但是必须保证调用顺序正确,不会出现死循环。
三、派生类的构造函数的使用方法1. 显式地调用基类的构造函数派生类的构造函数可以显式地调用基类的构造函数,以初始化基类的成员变量。
调用基类的构造函数的方法有两种:一种是在派生类的构造函数的初始化列表中调用,另一种是在派生类的构造函数的函数体中调用。
2020云南教师资格考试综合知识与能力:辨析之派生类属和相关类属1.派生类属:新知是原有知识的特例、例证、派生物,充实、证实了原有概念。
例如:学生一开始认为水果是一种多汁、味甜、可食用的食物后,学习苹果。
发现苹果也是一种多汁、味甜、可食用的食物。
其他经典例子:1.知道鸟是一种会飞、有羽毛、前肢为翼、无齿有喙的哺乳动物,之后学习麻雀,属于派生类属。
此时对于鸟的原先认知并未发生改变,只是原有知识的例证,目的是来证实原有概念的认知。
2.相关类属:新知类属于原有观念,扩展、修饰、限定了原有知识,使其精确化。
例如:学生一开始认为水果是一种多汁、味甜、可食用的食物后,学习香蕉。
发现香蕉是一种不多汁、味甜、可食用的食物。
其他经典例子:1.知道鸟是一种会飞、有羽毛、前肢为翼、无齿有喙的哺乳动物,之后学习企鹅,属于相关类属。
此时对于鸟的原先认知发生了实质性的改变,对先前的鸟的认知——会飞,有羽毛、前肢为翼,无齿有喙,产生了新的认知,即鸟是一种前肢为翼,无齿有喙的哺乳动物,此时使鸟的认知更加精确化。
总结区别:原有观念是否发生本质变化。
未发生本质变化属于派生类属,发生本质变化属于相关类属。
习题检测:1.学生在学习正方形、长方形、正三角形时已经形成了轴对称图形的概念,在学习圆时,将“圆也是轴对称图形”这一命题纳入原有轴对称图形概念中,这属于( )。
A.上位学习B.并列结合学习C.相关类属D.派生类属1.【答案】D。
解析:题干描述的是原先已经获得了轴对称图形的概念后将圆也是一种轴对称图形直接纳入原有认知结构中,此时对于原先的认知未发生改变,属于派生类属。
所以,此题选D。
2.学生已知“平行四边形”这一概念的意义,教师再通过“菱形是四边一样长的平行四边形”这一命题界定菱形,使学生在掌握平行四边形概念基础上学习菱形这一概念,这种学习属于( )。
A.派生类属学习B.总括学习C.相关类属学习C.组合学习2.【答案】C。
根据题干表述信息,原先对于平行四边形的认知未两组对边平行且相等的图形,而之后学习菱形时发现菱形时一种四边相等的平行四边形。
一.继承与派生的概念在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。
但是面向对象设计中代码的复用性和扩展性还没有体现出来。
对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。
类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。
下图说明了某个公司雇员的派生关系。
位于最高层的雇员其抽象程度最高,是最具一般性的概念。
最下层抽象程度最低,最具体。
从上层到下层是具体化的过程,从下层到上层是抽象话的过程。
面向对象设计中上层与下层是基类与派生类的关系。
我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。
每个雇员都有姓名、级别和薪水等信息。
每种雇员都可以升级,但升级方式不同。
他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。
这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。
但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等我们应该先描述所有雇员的共性,再分别描述每类雇员。
分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。
这种描述方法在面向对象设计中就是类的继承与派生。
对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。
类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。
这两个概念是两个相对的方向上的。
由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。
已有类叫做基类或者父类,产生的新类叫做派生类或者子类。
一.继承与派生的概念
在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。
但是面向对象设计中代码的复用性和扩展性还没有体现出来。
对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。
类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。
下图说明了某个公司雇员的派生关系。
位于最高层的雇员其抽象程度最高,是最具一般性的概念。
最下层抽象程度最低,最具体。
从上层到下层是具体化的过程,从下层到上层是抽象话的过程。
面向对象设计中上层与下层是基类与派生类的关系。
我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。
每个雇员都有姓名、级别和薪水等信息。
每种雇员都可以升级,但升级方式不同。
他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。
这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。
但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等
我们应该先描述所有雇员的共性,再分别描述每类雇员。
分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。
这种描述方法在面向对象设计中就是类的继承与派生。
对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。
类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。
这两个概念是两个相对的方向上的。
由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。
已有类叫做基类或者父类,产生的新类叫做派生类或者子类。
派生类同样又可以作为基类派生新的子类,这样就形成了类的层次结构。
二.派生类的声明
派生类声明的语法形式为:
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类是私有继承。
关于继承方式的详细说明鸡啄米后面很快会讲。
派生类声明语法形式中的派生类成员指除了原封不动从基类中继承来的成员以外,修改的基类成员或者新增加的成员。
派生类成员是对基类的扩展。
从基类继承产生派生类实现了对代码的复用,派生类中修改的基类成员或新增加的成员实现了对代码的扩展。
这样继承与派生使得我们减少了重复性劳动,提高了软件开发效率,维护和扩展程序更容易。