《面向对象程序设计》第六章 多态性与虚函数(6.3)纯虚函数与同一协议的多版本

6.3纯虚函数与同一协议的多版本 在大多数情况下,多态基类中的虚函数不被调用。有时,多态基类的通用性非常之高, 以至于它的实例对象几乎没有意义。这是因为通用性高的多态基类的功能是为了表达统一的 协议和接口,提供一套成员函数的核心集合和派生类将使用的变量,描述公共继承模式,便 于动态联编,为统一协议提供多种执行版本。为了防止抽象性高的类被实例化,可以在程序 中加入出错代码,当企图实例化时给出出错信息。更好的办法是让编译器来做这个工作。于 是,C++提供了纯虚函数( pure virtual function)的概念和实现 6.3.1纯虚函数的定义和性质 当设计的基类并不与实例对象直接联系起来时,类中定义函数并不作具体工作,而是为 派生类提供公共界面,那么可将其函数定义为纯虚函数。 纯虚函在基类中的原型说明形式如下: virtual type func name( parameter list=0 这个说明与一般虚函数相比的特殊之处是,设置函数等于0,它通知编译器该函数还没 有定义函数体。在该类的 VTABLE中,为该函数留了位置,但为空 C++提供的纯虚函数的性质是,在类说明中不需要提供实际操作定义,具有纯虚函数的 类也不能定义任何对象,它的任何派生类都应强制覆盖这个纯虚函数。 注意:构造函数和析构函数都不能是纯虚函数。 6.3.2抽象类的用法 如果一个类包含有纯虚函数,则称为抽象类( abstract base class) 由于抽象类中至少含有一个纯虚函数(没有真正的函数体)。因而在使用上,应明确下 列要点 (1)抽象类不能创建相应的对象,只能作为其他类的基类。 (2)抽象类不是完整数据类型,不能作函数返回类型、参数类型或显式转换类型 (3)可以建立指向抽象类的指针和引用,并通过基类(抽象类)指针指向派生类,实 现运行时的多态机制。 虽然纯虚函数不被多态调用,但是它可以有自己的定义,其目的是将公共的代码放在高 层次的类中,便于被尽量多的类继承,减少书写重复代码的工作量 例6.5]抽象类的用法EX65.CP。 6.3.3纯虚函数的应用例析 利用纯虚函数的多态性编程,通过一个构造存储对象实例来讨论。 [例6.6]纯虚函数的应用例析EX66.CPP
6.3 纯虚函数与同一协议的多版本 在大多数情况下,多态基类中的虚函数不被调用。有时,多态基类的通用性非常之高, 以至于它的实例对象几乎没有意义。这是因为通用性高的多态基类的功能是为了表达统一的 协议和接口,提供一套成员函数的核心集合和派生类将使用的变量,描述公共继承模式,便 于动态联编,为统一协议提供多种执行版本。为了防止抽象性高的类被实例化,可以在程序 中加入出错代码,当企图实例化时给出出错信息。更好的办法是让编译器来做这个工作。于 是,C++提供了纯虚函数(pure virtual function)的概念和实现。 6.3.1 纯虚函数的定义和性质 当设计的基类并不与实例对象直接联系起来时,类中定义函数并不作具体工作,而是为 派生类提供公共界面,那么可将其函数定义为纯虚函数。 纯虚函在基类中的原型说明形式如下: virtual type func_name(parameter_list)=0; 这个说明与一般虚函数相比的特殊之处是,设置函数等于 0,它通知编译器该函数还没 有定义函数体。在该类的 VTABLE 中,为该函数留了位置,但为空。 C++提供的纯虚函数的性质是,在类说明中不需要提供实际操作定义,具有纯虚函数的 类也不能定义任何对象,它的任何派生类都应强制覆盖这个纯虚函数。 注意:构造函数和析构函数都不能是纯虚函数。 6.3.2 抽象类的用法 如果一个类包含有纯虚函数,则称为抽象类(abstract base class)。 由于抽象类中至少含有一个纯虚函数(没有真正的函数体)。因而在使用上,应明确下 列要点: (1)抽象类不能创建相应的对象,只能作为其他类的基类。 (2)抽象类不是完整数据类型,不能作函数返回类型、参数类型或显式转换类型。 (3)可以建立指向抽象类的指针和引用,并通过基类(抽象类)指针指向派生类,实 现运行时的多态机制。 虽然纯虚函数不被多态调用,但是它可以有自己的定义,其目的是将公共的代码放在高 层次的类中,便于被尽量多的类继承,减少书写重复代码的工作量。 [例 6.5] 抽象类的用法 EX6_5.CPP。 6.3.3 纯虚函数的应用例析 利用纯虚函数的多态性编程,通过一个构造存储对象实例来讨论。 [例 6.6] 纯虚函数的应用例析 EX6_6.CPP
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
- 《面向对象程序设计》第六章 多态性与虚函数(6.2)虚函数方法与多态机制.doc
- 《面向对象程序设计》第六章 多态性与虚函数(6.1)重载与程序的多态性设计.doc
- 《面向对象程序设计》第八章 C++系统流库的I/O操纵算子(8.3)自定义的操纵算子.doc
- 《面向对象程序设计》第八章 C++系统流库的I/O操纵算子(8.2)创建内核流.doc
- 《面向对象程序设计》第八章 C++系统流库的I/O操纵算子(8.1)创建文件流.doc
- 《面向对象程序设计》第五章 继承性和派生类(5.5)赋值兼容规则.doc
- 《面向对象程序设计》第五章 继承性和派生类(5.4)继承性应用实例分析.doc
- 《面向对象程序设计》第五章 继承性和派生类(5.3)多重继承的设计.doc
- 《面向对象程序设计》第五章 继承性和派生类(5.2)基类和派生类.doc
- 《面向对象程序设计》第五章 继承性和派生类(5.1)类层次、数据抽象和模块化.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.6)输入输出流简介.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.5)C++的语句及程序流程控制.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.4)C++的运算符和表达式.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.3)C++数据类型.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.2)C++程序构架及词法符号约定.doc
- 《面向对象程序设计》第二章 C++基本知识速成(2.1)C++语言概述.doc
- 《面向对象程序设计》第三章 聚合数据类型与操作函数(3.4)结构类型及链表处理.doc
- 《面向对象程序设计》第三章 聚合数据类型与操作函数(3.3)函数类型与应用方法.doc
- 《面向对象程序设计》第三章 聚合数据类型与操作函数(3.2)指针类型与地址算法.doc
- 《面向对象程序设计》第三章 聚合数据类型与操作函数(3.1)数组类型与简单线性表处理.doc
- 《面向对象程序设计》第六章 多态性与虚函数(6.4)利用类库中虚函数进行多态程序设计.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.1)类的构造和创建.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.2)构造函数和析构函数.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.3)类构造的存储设计.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.4)类中类用法.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.5)类与对象的进一步用法.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.6)类与结构、联合的关系.doc
- 《面向对象程序设计》第四章 类与对象的构造设计(4.8)指向类成员的指针.doc
- 荆州职院:《平面广告设计》第二章 平面广告市场调查.ppt
- 荆州职院:《平面广告设计》第一章 序言.ppt
- 荆州职院:《平面广告设计》第四章 平面广告的创意及表现.ppt
- 荆州职院:《平面广告设计》第五章 平面广告设计的表现技法.ppt
- 荆州职院:《平面广告设计》第六章 平面广告的编排设计.ppt
- 荆州职院:《平面广告设计》第七章 平面广告分类设计法则.ppt
- 荆州职院:《平面广告设计》电子教案.doc
- 宜宾职业技术学院:《办公自动化》课程教学资源_考试试题(二).doc
- 宜宾职业技术学院:《办公自动化》课程教学资源_考试试题(三).doc
- 宜宾职业技术学院:《办公自动化》课程教学资源_考试试题(一).doc
- 宜宾职业技术学院:《办公自动化》课程教学资源_考试试题(四).doc
- 宜宾职业技术学院:《办公自动化》课程教学资源_考试试题(八).doc