概念介绍与派生类的声明

合集下载

C++ 基类和派生类

C++ 基类和派生类

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 -。

派生类(继承)的概念

派生类(继承)的概念

4.1 派生类的概念
上一节 上一页 下一页 下一节
4.1.2 派生类的声明
1.声明派生类的一般格式为: class 派生类名:继承方式 基类名 { //派生类中新增或改写的数据成员和成员 函数 }; 2.继承方式 继承方式可以是public、private和protected,分 别表示公有、私有和保护继承。 系统默认的继承方式为私有(private)继承。
4.1 派生类的概念
class student:public person{ int score; int grade; public: student(……); void print( ) {cout<<name<<“ “<<age <<“ “<<sex<<“ ”<<score <<“ “<<grade<<endl;} }; 从基类person中继承来的私 有数据成员name、age、sex 在派生类中不能直接访问, 如何解决?
类2
下一页 下一节
4.1.2 派生类的声明
引例:构造学生类和雇员类
class student{ char name[10]; int age; char sex; int score; int grade; public: student(……); void print( ) {cout<<name<<“ “ <<age<<“ “<<sex<< “ ”<<score<<“ “<< grade<<endl;} };
protected

面向对象程序设计 四

面向对象程序设计 四
第四章 派生类与继承
• 4.1 派生类的概念 • 4.2 派生类的构造函数和析构函数 • 4.3 调整基类成员在派生类中的访问属性的 其他方法 • 4.4 多重继承 • 4.5 赋值兼容规则
第四章 派生类与继承
继承允许在既有类的基础上创建新的类,新类可以从 一个或多个既有类中继承数据和函数,而且可以重新定义 或加进新的数据和函数。 假设有两个类---类A 和类B,若类B继承类A,则类B 具有类A的基本特性(包括数据和程序代码) A (基类或父类) B (派生类或子类)
(3)基类中的保护成员:
当继承方式为公有继承时,基类中的保护成员在派生类中为保护成员 当继承方式为私有继承时,基类中的公有成员在派生类中为私有成员 当继承方式为保护继承时,基类中的公有成员在派生类中为保护成员
4.1 派生类的概念
4.1.4 派生类对基类成员的访问规则 派生类对基类成员的访问形式: (1)内部访问:由派生类中新增成员对基类继承来的成员的访问。 (2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的 成员的访问。 派生类对基类成员的访问规则 (1)私有继承的访问规则 (2)公有继承的访问规则 (3)保护继承的访问规则
4.2 派生类的构造函数和析构函数
在类间实现继承时,虽然派生类继承了基类的成员,从而实现了 原代码的重用,但由于基类的构造函数和析构函数不能被继承 基类的构造函数和析构函数不能被继承,因此 基类的构造函数和析构函数不能被继承 在派生类中,如果对派生类新增的成员进行初始化,就需要加入派生 类的构造函数。 同时,对所有从基类继承下来的成员的初始化工作,还是由基类 的构造函数来完成,但是我们必须在派生类中对基类的构造函数所需 必须在派生类中对基类的构造函数所需 要的参数进行设置。 要的参数进行设置 同样,对撤销派生类对象时的扫尾、清理工作也需要加入新的析 构函数来完成。

派生类

派生类

继承与派生类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分析:一个派生类可以作为另一个派生类的基类。

基类和派生类

基类和派生类
这里说的访问来自两个方面:一是派生类中的新增成 员对从基类继承来的成员的访问;二是在派生类外部通 过派生类的对象对从基类继承来的成员的访问。
5
(1)公有继承(public)
当类的继承方式为公有继承时,基类的公有和保 护成员的访问属性在派生类中不变,而基类的私有 成员不可访问,
即基类的公有成员和保护成员被继承到派生类中 仍作为派生类的公有成员和保护成员,派生类的其 他成员可以直接访问它们。
具体赋值规则如下: 派生类的对象可以赋值给基类对象。 派生类的对象可以初始化基类对象的引用。 派生类对象的地址可以赋给指向基类对象的 指针。
15
例如: class A{...};
class B: public A
{void fun() {...}}; A a; B b; a=b; //将对象b中所含类A成员的值赋给对象a A &a1=b; //用派生类对象初始化基类对象的引用 A *pa =&b;
22
基类名1,继承方式2 基类名2,… {…} ;
{ 派生类类体
class C : public
};
A , private B
多重继承允许一个派生类同时继 {…} ; // C 公有
承多个基类中的成员,支持了软件 继承 A,私有继
的重用性,但也可能带来大量的二 承 B
义性问题。 17
复合与继承在软件渐增式开发中的应用
10
3.在派生类中重定义基类的函数
派生类自动继承了基类中定义的数据成员和成员函数。 如果派生类认为基类中某个成员函数的实现不能满足需 要,可以在派生类中重新定义该函数。
重定义基类的成员函数需要使用和该函数相同的函数 名和参数列表,如果参数列表不同,就是函数重载而不 是函数的重定义了。

2019景德镇教师招聘考试:相关类属vs派生类属

2019景德镇教师招聘考试:相关类属vs派生类属

2019景德镇教师招聘考试:相关类属vs派生类属原因就是同学们掌握二者概念的时候,很多人都是用例子来记住概念,而不是用例子去理解概念。

在这里纠正同学们一个错误的认识,就是例子仅仅是一种特殊情况,他应该是被概念所包含,而不应该与概念等同。

所以想要对相关类属和派生类属更深刻的理解,还是需要各位同学认真理解其概念。

在这里为同学们提供了两个不同权威教材中对两个概念的表述和解释,希望能帮助同学们作出区分。

陈琦、刘儒德《当代教育心理学》中这样论述:下位学习可以分为两种形式,一种是派生类属,即新学习内容仅仅是学生已有的、包容面较广的命题的一个例证,或是能从已有命题中直接派生出来的。

例如,知道了“长方形的四个顶角都是直角”,而正方形是长方形的一种特例,那就很容易理解“正方形的四个顶角都是直角”。

另一种是相关类属,即新内容纳入可以扩展、修饰或限定学生已有的概念、命题,并使其精确化。

例如,学生学习了“杠杆”的概念,知道了杠杆的力臂原理,而后他们学习滑轮,知道定滑轮实质上是一种等臂杠杆,这就把“定滑轮”同化到了“杠杆”之下,但学生对杠杆的理解也会有一定变化:杠杆并不一定是一根细长的,它也可以是一个圆轮子。

在皮连生《教育心理学》中有这样的描述:在下位学习或类属学习中,需要区分两种不同的类属过程。

第一,派生类属过程。

当新的学习材料作为原先获得的概念的特例,或作为原先获得的命题的证据或例证而加以解释时,便产生了派生类属学习。

在上述两种情形中,所要学习的新材料可以直接从认知结构中原有的具有更高包容性和概括性的概念或命题中推衍出来,或者蕴含在其中,也就是说,新知识只是旧知识的派生物。

在这样的条件下,派生材料的意义出现很快,学习比较省力。

例如,若学生在学习正方形、长方形、三角形时已形成轴对称图形概念。

在学习圆时,“圆也是轴对称图形”这一命题被纳入或类属于原有轴对称图形概念,新的命题很快就获得意义,学生立即能发现圆具有轴对称图形的一切特征。

第5章 派生类

第5章 派生类

class b:public a { public: void set(int i ,int j) { y=i; x=j; //错误,不能继承私有 } }; class b:protected a { public: void set(int i) { x=i; //访问基类保护成员 };
例2:class a { protected: int x; } ;
1.抽象基类: 1.抽象基类:在基类中只有纯虚函数的声明,该函数 抽象基类 的定义在派生类中的类。抽象基类只能派生新类,不能定 义对象。 2.纯虚函数的声明 2.纯虚函数的声明
函数名(参数表)=0; virtual 类型 函数名(参数表)=0; 例:class a class b:public a { { public: public: int x; void s() vritual void s()=0; { }; x=1; void main() } }; { a bl;\\错,不能定义对象 } 例:5.11 用抽象基类计算矩型面积。
当某个类继承了它类的属性和功能时,则该类是他类的派生类。 当某个类继承了它类的属性和功能时,则该类是他类的派生类。
一.派生类的定义: 派生类的定义:
派生类名: class 派生类名:权限 基类名 { private: 私有成员列表 protected: 保护成员列表 public: 公有成员列表 } ; 例:class a { … }; class b:public a { … }; //b是a的公有派生
1.作用:编译时不在对象中为虚函数分配空间,只分配调用虚函数 的指针,在运行时动态连接。 2.定义: virtual 类型 { 函数体 } 例:class a { public: int x; vritual void s(); }; 例:5.4 阅读分析程序 vritual void a::s() { … } 函数名(参数表) 函数名(参数表)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一.继承与派生的概念
在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。

但是面向对象设计中代码的复用性和扩展性还没有体现出来。

对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。

类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。

下图说明了某个公司雇员的派生关系。

位于最高层的雇员其抽象程度最高,是最具一般性的概念。

最下层抽象程度最低,最具体。

从上层到下层是具体化的过程,从下层到上层是抽象话的过程。

面向对象设计中上层与下层是基类与派生类的关系。

我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。

每个雇员都有姓名、级别和薪水等信息。

每种雇员都可以升级,但升级方式不同。

他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。

这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。

但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等
我们应该先描述所有雇员的共性,再分别描述每类雇员。

分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。

这种描述方法在面向对象设计中就是类的继承与派生。

对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。

类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。

这两个概念是两个相对的方向上的。

由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。

已有类叫做基类或者父类,产生的新类叫做派生类或者子类。

派生类同样又可以作为基类派生新的子类,这样就形成了类的层次结构。

二.派生类的声明
派生类声明的语法形式为:
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类是私有继承。

关于继承方式的详细说明鸡啄米后面很快会讲。

派生类声明语法形式中的派生类成员指除了原封不动从基类中继承来的成员以外,修改的基类成员或者新增加的成员。

派生类成员是对基类的扩展。

从基类继承产生派生类实现了对代码的复用,派生类中修改的基类成员或新增加的成员实现了对代码的扩展。

这样继承与派生使得我们减少了重复性劳动,提高了软件开发效率,维护和扩展程序更容易。

相关文档
最新文档