第5章 派生类与继承

合集下载

第5章 继承性、多态PPT课件

第5章  继承性、多态PPT课件
• sealed class MyClass •{ •} • 当程序中密封了某个类时,其他类是不能继承该
类的,如代码所示。 • 【本示例参考:\示例代码\Chap05\SealedClass1】
2020/10/13
9
5.2.5 方法的隐藏
• 【本节示例参考:\示例代码 \Chap05\HidingMethod】
• operand is type
• 在上述定义中,当type是一个类,而operand也是该类型、或继承 了该类型、或封箱到该类型中时结果为true;当type是一个接口 类型,而operand也是该类型,或者执行该接口的类型结果也为 true;当type是一个值类型,而operand也是该类型,或者被拆箱 到该类型中时结果也为true。如下面的一个简事例:
• 还有一种方法可以实现在派生类中的覆盖,即new 关键字。这种过程叫做方法的隐藏。但是,派生 类和非抽象类的基类方法必须有相同的方法。代 码演示了如何实现方法的隐藏。
• 运行结果: • Study方法被调用 • Person方法被调用 • 方法隐藏的作用就是可以改变基类的方法。如果
一个派生类型被强制向上转换为基类型,基类型 的方法将被调用。
• C# 2008程序是通过使用名空间来组织的。其不仅 可以是应用程序的内部结构体系,同样也可以是 外部结构体系。如果程序中的一些元素要被导出 到其他程序,可以使用命名空间。程序中免不了 会出现错误,这时就会用到C#语言的异常处理机 制。
2020/10/13
1
5.1 继承机制
• 面向对象的重要机制之一继承是可以使用以前建 造类的方法和属性。通过简单的程序代码来建造 功能强大的类,不仅会节省很多编程时间,而且 还可以减少代码出错的机会。

组合和继承

组合和继承
类的继承就是新的类从已有类那里得到已有的特性。或者 说,从已有类产生新类的过程就是类的派生。 类的继承和派生机制使程序员无需修改已有类,只需在已 有类的基础上,通过增加少量代码或修改少量代码的方法 得到新的类,从而较好地解决了代码重用的问题。 新类可以从一个或多个已有类中继承数据和函数,并且可 以重新定义或增加新的数据和函数,其中已有类称为基类 或父类,在它基础上建立的新类称为派生类或子类。派生 类同样也可以作为基类派生出新的类,从而形成类的层次 或等级结构。
例如有以下的类X : class X { 类名1 ob1; 类名2 ob2; … 类名n obn; };
5.1.2 对象成员的初始化
类X的构(参数表1),ob2(参数表2),…,obn(参数表n) { 类B的构造函数体 }
参数表1、参数表2 、… 、参数表n的数据,一般来自参数表 0。当类名1、类名2...类名n的构造函数不带参数或带有默认 参数时,类X的构造函数中冒号及后面的对象成员初始化列 表可省。例如:
Point::InitP; Point::GetX; … };
注意:1)在派生类中声明基类的函数时,只需给出函数的名 称,函数的参数和返回值类型不应出现。
class Rectangle: private Point{
……
public:
Point::InitP;
//正确
Point::GetX;
//正确
X∷X(参数表0) { 类B的构造函数体 }
5.1.2 对象成员的初始化
当调用构造函数X()时,首先按个对象成员在类中声明的 顺序依次调用它们的构造函数,对这些子对象初始化; 然后再执行X()的构造函数体初始化类中个其它成员。 析构函数的调用顺序与构造函数的调用顺序相反。

第5章 继承和派生类

第5章 继承和派生类
19
对类B的对象初始化即是对x,y,z,m,n等全部成员的初始化
5.4.2 私有继承
私有派生,派生类中基类的公有和保 护成员成为私有
class ClassName : private BaseClassName
私有派生时,基类中公有成员和保护成员在派生类 中均变为私有,在派生类中仍可直接使用这些成员,基 类中的私有成员,在派生类中不可直接使用。
15
从一个基类派生一个类的一般格式为:
class ClassName : <Access> BaseClassName
{ private: public:
派生类名 继承方式 基类名
......; //私有成员说明
......; //公有成员说明
protected:
派生类中新增加的成员
......; //保护成员说明
C++程序设计
主讲:王新祥
第5章 继承和派生类
2
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9
继承与派生的概念 派生类的声明方式 派生类的构成 派生类成员的访问属性 派生类的构造函数和析构函数 多重继承 基类与派生类的转换 继承与组合 继承在软件开发中的重要意义
3
继承性是面向对象程序设计中最重要的机制。这 种机制提供了无限重复利用程序资源的一种途径。通 过C++语言中的继承机制,可以扩充和完善旧的程序 以适应新的需求。这样不仅可以节省程序开发的时间 和资源,并且为将来的程序增添了新的资源。
基类:public: 在派生类和类外都可以使用 protected: 在派生类中使用 private: 不能在派生类中使用
17
class A { int x; 因为y是基类保护,所以在派生类中可以 protected: int y; 直接引用。而在类外不可直接引用。 public: int z; A(int a, int b, int c) { x=a; y=b; z=c; } //基类初始化 int Getx() { return x; } //返回x int Gety() { return y; } //返回y void ShowA() { cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } }; 因为z是基类公有,所以 公有派生 class B : public A { 在 派 生类 中和 类 外均 可 对基类初始化 int m, n; 直接引用。 public: B(int a, int b, int c, int d, int e) : A(a, b, c) { m=d; n=e; } void Show() { cout<<"m="<<m<<'\t'<<"n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum() { return (Getx()+y+z+m+n); } }; 因为x是基类私有,所以在派生类中和类外不能直接引用 void main(void) { B b1(1, 2, 3, 4, 5); b1.ShowA(); b1.Show(); cout<<"Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; cout<<"y="<<b1.Gety()<<'\t'; cout<< "z="<<b1.z<<'\n'; } 18

C++第5章习题参考答案

C++第5章习题参考答案

1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。

继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。

它使得某类对象可以继承另外一类对象的特征和能力。

继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。

通过继承方式定义的子类也称为派生类。

2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。

对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。

表5.1列出了不同继承方式下基类成员访问属性的变化情况。

表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。

其余单元格内容为基类成员在派生类中的访问属性。

从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。

(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。

(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。

(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。

需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。

在同一类中私有成员和保护成员的用法完全一样。

3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。

具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。

保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。

这样,既方便了派生类的访问,又禁止外界对它的派生类访问。

第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() { … } 函数名(参数表) 函数名(参数表)

王芳-数字档案馆学-第五章 数字档案馆系统的分析与设计

王芳-数字档案馆学-第五章 数字档案馆系统的分析与设计

第一节信息系统开发方法介绍
一、结构化生命周期法 (二)结构化分析与结构化设计 3、结构化设计的概念
结构化设计的核心是模块分解设计。结构化设计 运用一套标准的设计准则和工具,对系统控制层 次关系和模块进行分解。模块化显著提高了系统 的可修改性和可维护性,同时,为系统设计工作 的有效组织和控制提供了方便条件。结构化设计 最重要的概念包括模块化、内聚与耦合
第一节信息系统开发方法介绍
一、结构化生命周期法 (二)结构化分析与结构化设计 2、结构化设计 结构化设计是软件生命周期的重要组成部分, 是指把通过数据、功能和行为模型展示的软件 需求传送给设计阶段,由设计阶段产生体系结 构设计、接口设计、数据设计和过程设计
第一节信息系统开发方法介绍
一、结构化生命周期法 (二)结构化分析与结构化设计 2、结构化设计
第一节信息系统开发方法介绍
二、原型法
原型法的主要优点表现为:原型法的开发过程是 一个循环往复的反馈过程,符合用户对计算 机 应用的认识逐步发展、螺旋式上升的规律。 原 型法很具体,使用户能很快接触和使用系统,容 易为不熟悉计算机应用的用户所接受,可提 高 用户参与系统开发的积极性。
第一节信息系统开发方法介绍
第五章数字档案馆系统的分析与设计
本章要点
介绍了信息系统开发的一般方法,包括结构化 生命周期法、原型法、面向对象的开发方法以 及计算机辅助设计工程CASE;分析了档案信息 系统的规划方法和可行性研究;最后阐述了档 案信息系统设计的步骤和方法
关键词
档案信息系统 结构化生命周期法 原型法
面向对象的开发方法
第一节信息系统开发方法介绍
一、结构化生命周期法 (二)结构化分析与结构化设计 1、结构化分析 结构化分析方法适合于数据处理类型软件的需求 分析。由于利用图形表达需求显得清晰、简 明 ,易于学习和掌握。具体来说,结构化分析 方 法就是用抽象模型的概念,按照软件内部数 据 传递、变换的关系,自顶向下逐层分解,直 到 找到满足功能要求的所有可实现的软件为止。

第5章 继承和派生类

面象对象程序设计
2010/9/18
第5章 继承和派生类
程序运行结果: x=4 y=5 l=6 w=8 程序分析: 通过公有继承方式,从BaseClas类得到DerivedClass类。 派生类DerivedClass只有一个基类,所以是单继承。基类 BaseClass定义了两个数据成员,3个成员函数。派生类 DerivedClass定义了两个数据成员,3个成员函数。通过 继承,派生类DerivedClass拥有4个数据成员:x、y、l和 w,6个成员函数:setx ( )、sety ( )、setl ()、setw ( )、 displayxy ( )、displaylw( )。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class Father:private Grandfather //中间类:Grandfather的 公有派生类, //Son的基类 { public: void test() { b1=10; //可以访问,因b1改为private b2=20; //可以访问,因b2改为private b3=30; //不可访问, 因b3改为不可访问 } };
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.1.2 继承的种类
在C++语言中,一个派生类既可以从一个基类派生,也可 以从多个基类派生。从一个基类派生的继承被称为单继承。 单继承形成的类层次是一个倒挂的树,如图5.2所示。从 多个基类派生类的继承被称为多继承。多继承形成的类层 次是一个有向无环图(DAG),如图5.3所示。在图5.2中, 输入设备是基类,从它派生出了3个派生类:键盘类、鼠 标类和扫描仪类。在图5.3中,从教师类和干部类派生出 校长类,即校长类有两个基类。

第5章 派生类与继承


void print();
};
print();
};
//定义一个基类 class person{ protected: char name[10]; int age; char sex; public: //…… }; //定义一个派生类 class employee:public person { protected: char department[20]; float salary; public: //…… };
当类的继承方式为私有继承时,基类的public成员和 protected成员被继承后作为派生类的private成员,派生类 的其他成员可以直接访问它们,但是在类外部通过派生类的 对象无法访问。
基类的private成员在私有派生类中是不可直接访问的, 所以无论是派生类成员还是通过派生类的对象,都无法直接 访问从基类继承来的private成员,但是可以通过基类提供 的public成员函数间接访问。 例5.1一个私有继承的例子
由于派生类继承了基类的成员,派生类的构造 函数需要调用基类的构造函数对其中定义于基 类的数据成员进行初始化。 给基类构造函数传递实际参数是通过向派生类 构造函数传递实际参数以及初始化列表来间接 实现传递的。
5.2.1 派生类构造函数和析构函数的执行顺 序 通常情况下,当创建派生类对象时, 首先执行基类的构造函数,随后再执行 派生类的构造函数; 当撤消派生类对象时,则先执行派生 类的析构函数,随后再执行基类的析构 函数。
例5.3 公有继承的访问规则
表5-3 公有继承的访问规则
基类成员 内部访问 对象访问 Private成员 不可访问 不可访问 public成员 可访问 可访问 protected成员 可访问 不可访问

第5章习题

一. 填空题1. 在面向对象的设计方法中,和分别是表现事物及事物间相互联系的概念。

2. 面向对象方法的基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的方式。

3. 对象是对现实世界实体的,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作,封装在一起所构成的统一体。

4. 对象之间通过互相联系,以模拟现实世界中不同事物彼此之间的联系。

5. 面向对象方法学的基本原则是按照人类习惯的思维方法建立的模型,开发出尽可能直观、自然地表现求解方法的软件系统。

6. 对象具有性、性、性、性、__________性等。

7. 类的定义是具有相同__________和__________的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。

8. 一个类的上层可以有__________,下层可以有__________,形成一种层次结构。

9. 一个类可以直接继承多个类,这种继承方式称为__________。

如果限制一个类至多只能有一个超类,则一个类至多只能直接继承一个类,这种继承方式称为__________。

10. 如果类A具有类B的全部属性和全部服务,而且具有自己特有的某些属性或服务,则A 叫做B 的__________,B 叫做A 的__________。

11. 在面向对象的系统中,每个对象都属于一个类,属于某个类的对象称为该类的一个__________。

12. 消息就是向对象发出的__________,它应含有提供服务的对象标识、服务标识、输入信息和回答信息。

13. __________性是面向对象程序设计语言不同于其他语言的最主要特点,是其他语言所没有的。

14. 在收到消息时对象要予以响应,不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做__________。

15. 面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用,它包括面向__________、__________、__________、__________和面向对象的维护等主要内容。

C++程序设计04737 第5章 类的继承与派生


5.1 类的继承与类的派生
5.1.2 派生类的定义与大小
2.类的大小
1. //[程序5-2]基类与子类占用空间及字节对齐
2. #include <iostream>
3. using namespace std;
4. class BaseClass //基类
5. {
6.
int v1, v2;
7.
派生类中包含了基类的成员变量,且基类
成员变量在前,派生类成员变量在后。基 类占用了12个字节,在此之后要分配派生 类自身的成员变量,一个int型变量和一个 指针变量。在64位系统中,指针占8个字 节。所以派生类的大小=12+4+8=24字节。 32位系统中指针的大小是4字节。
5.1 类的继承与类的派生
5.1 类的继承与类的派生
5.1.3 继承关系的特殊性
//[程序5-3]派生类继承了友元函数
#include <iostream>
using namespace std;
class another;//前向引用声明
class Base//基类
{private: float x;
public: void print(const another &K);};
d.print(ano);//输出: Base: 100
return 0;
}
如果派生类Derived中重写了print(),若还想在函数中访问another的私有成员,则必须将类Derived的print()函数也
声明为another的友元。在类another中需要添加如下声明:
friend void Derived::print(const another &K);//派生类的成员函数声明为本类的友元
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++程序设计
派生类的概念
基类成员在派生类中的访问权限
派生方式 public
基类中的访问权限 public protected private public

从以上类的声明可以看出,这两个类中的数据成员和成员函 数有很多相同的地方。只要在person类的基础上再增加数据 成员department和salary,再对print()成员函数稍加修改就 可以定义出employee类。像这样定义两个类,代码重复太严 重。为了提高代码的可重用性,就必须引入继承性,将 employee类说明成person类的派生类,那些相同的成员在 C++程序设计 employee类中就不需要再定义了。
C++程序设计
派生类的概念
说明: (1)派生类以公有派生的方式 继承了基类,并不意味着派 生类可以访问基类的私有成 员。
#include <iostream.h> class base { int x; public: void setx(int n) { x=n; } void showx() { cout<<x<<endl; } }; class derived : public base { int y; public: void sety( int m) { y=m; } void show_sum() { cout<<x+y<<endl; //非法 } void showy() { cout<<y<<endl; } C++程序设计 };
class 类名 { [private:] 私有数据成员和成员函数 protected: 保护数据成员和成员函数 public: 公有数据成员和成员函数 };
C++程序设计
派生类的概念

保护成员可以被派生类 的成员函数访问,但是 对于外界是隐藏的,外 部函数不能访问它。
#include <iostream.h> class samp { int a; protected: int b; public: int c; samp(int n, int m) { a=n; b=m; } int geta() { return a; } int getb() { return b; } }; int main() { samp obj(20, 30); //非法 obj.b=99; obj.c=50; cout<<obj.geta()<<endl; cout<<obj.getb()<<“ ”<<obj.c<<endl; return 0; C++程序设计 }
C++程序设计
派生类的概念
3. 私有派生 (1)私有派生类对基类成员的 访问 私有派生得到的派生类,对 它基类的公有成员只能是私 有继承,也就是说基类中的 公有成员都只能成为私有派 生类的私有成员,这些私有 成员能够被派生类的成员函 数访问,但是基类私有成员 不能被派生类成员函数访问。
#include <iostream.h> class base { int x; public: void setx(int n) { x=n; } void showx() { cout<<x<<endl; } }; class derived : private base { int y; public: void setxy(int n, int m) { setx(n); y=m; } void showxy() { showx(); cout<<y<<endl; } { cout<<x<<y<<endl; } × }; int main() { derived obj; obj.setxy(10, 20); obj.showxy(); return 0; }
//派生类新增的数据成员和成员函数
};
说明: ① 派生类名就是要声明的新类 名。 ② 基类名是一个已经定义的类。
派生类的概念
③ 派生方式可以是关键字private或public。 private指派生类从基类私有派生; public指派生类从基类公有派生。 ④ 派生方式可以缺省,这时派生方式默认为private。 2. 两种派生方式的特点 ① 无论是哪种派生方式,基类中的私有成员既不允许外部函数 访问,也不允许派生类中的成员函数访问,但是可以通过基类 提供的公有成员函数访问。 ② 公有派生与私有派生的不同点在于基类中的公有成员在派生 类中的访问属性。 公有派生时,基类中的所有公有成员在派生类中也都是公有的 私有派生时,基类中的所有公有成员在派生类中都是私有的
派生类的概念
公有派生和私有派生的访问特性
基类成员 派生方式 派生类成员 外部函数
基类私有成员 private 不可访问 不可访问 public 不可访问 不可访问
基类公有成员 private 可访问 不可访问 public 可访问 可访问
C++程序设计
派生类的概念 5.1.3 保护成员



保护成员:即protected成员,是C++提供的具有另一种访问 属性的成员 Protected说明符可以放在类声明的任何地方,通常将它放在 私有成员声明之后,公有成员声明之前。 类声明的一般格式:
第5章 派生类与继承
内容提要: 派生类的概念 派生类的构造函数和析构函数 多重继承 虚函数与多态性


继承是面向对象程序设计的一个重要特性。 它允许在既有类的基础上创建新的类,新类可以从一 个或多个既有类中继承函数和数据,而且可以重新定 义或加进新的数据和函数,从而形成类的层次或等级。 既有类称为基类或父类,在它基础上建立的新类称为 派生类或子类。
C++程序设计
派生类的概念
(2)外部函数对私有派生类继 承来的成员的访问 私有派生时,基类的所有成 员在派生类中都成为私有成 员,外部函数不能访问。
#include <iostream.h> class base { int x; public: void setx(int n) { x=n; } void showx() { cout<<x<<endl; } }; class derived : private base { int y; public: void sety(int m) { y=m; } void showxy() { cout<<y<<endl; } }; int main() { derived obj; obj.setx(10); //非法 obj.sety(20); obj.showx(); //非法 obj.showy(); return 0; }
派生类的概念
5.1.2 派生类的声明
1. 声明一个派生类的一般格式
class 派生类名:派生方式 基类名 { //定义一个基类 class person { private: char name[10]; int age; char sex; public: //… }; //定义一个派生类 class employee: public person { private: char department[20]; float salary; public: //… }; C++程序设计
派生类的概念

为了便于派生类的访问, 可以将基类私有成员中需 要提供给派生类访问的成 员定义为保护成员。

C++规定:基类的保护成 员被派生类继承之后,若 为公有派生,则基类中的 保护成员在派生类中也为 保护成员;若为私有派生, 则基类中的保护成员在派 生类中成为私有成员。
#include <iostream.h> class base { protected: int a, b; public: void setab(int n, int m) { a=n; b=m; } }; class derive: public base { int c; public: void setc(int n) { c=n; } void showabc() { cout<<a<<“ ”<<b<<“ ”<<c<<endl; } }; int main() { derive obj; obj.setab(2, 4); obj.setc(3); obj.showabc(); return 0; } C++程序设计
C++程序设计
§5.1 派生类的概念
5.1.1 为什么要继承
现实世界中许多事物具有继承性,我们可以用层次分类的方 法来描述它们之间的关系。 例如:一个简单的汽车分类图

汽车
运输汽车
专用汽车
客车

货车消防车Fra bibliotek洒水车
继承性也是程序设计中的一个非常有用的、有力的特性,它 可以让程序员在既有类的基础上,通过增加少量代码或修改 少量代码的方法得到新的类,从而较好的解决代码重用的问 题。 C++程序设计
派生类的概念
class person { private: char name[10]; int age; char sex; public: void print(); }; class employee { private: char name[10]; int age; char sex; char department[20]; float salary; public: void print(); };
相关文档
最新文档