第十二章 多态性与抽象类

第十二章 多态与虚函数

一、多态的概念

向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为

具有不同功能的函数名可以用同一个函数名,以实现用一个函数名调用不同内容的函数

*静态多态和动态多态(编译时的多态性和运行时的多态性)

静态多态的特点:调用速率快、效率高,但缺少灵活性,在程序运行前就已经决定了执行的函数和方法

动态多态的特点:不在编译时确定调用的是哪个函数,只有在程序运行时才动态确定操作所针对的对象。动态多态是通过虚函数实现的。

二、利用虚函数实现动态多态性

*虚函数的作用

函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次的同名函数问题,前者是横向重载,后者可以理解成是纵向重载。(不同点:同一类族虚函数首部是相同的,而函数重载时的函数是不同的(这里指函数参数个数或类型不同))

*静态关联与动态关联(早期关联与滞后关联)

*虚函数声明

1.只能用virtual声明类的成员函数,把它作为虚函数

2.一个成员函数配声明为虚函数后,在同一类族就不能再定义一个非virtual 且函数首部相同的函数

3.考虑事项:

(1)如果成员函数在类的继承后出现功能的更改一般声明为虚函数

(2)如果通过基类指针或者引用去访问,则应当声明为虚函数

(3)有时会定义空函数体的虚函数,留给派生类添加

*虚析构函数

当基类有非虚析构函数时,只执行基类的析构函数,不执行派生类的析构函数。如果希望能执行派生类的析构函数,可以讲基类的析构函数声明为虚构函数,此时,该基类所有的派生类的析构函数都自动成为虚函数,即使派生类与基类的析构函数名不同。

注:构造函数不能声明为虚函数

三、纯虚函数与抽象类

1.纯虚函数概念

对于基类的虚函数不作任何处理的情况的一种简化形式

virtual 函数类型 函数名(参数表)= 0 ;

注意:纯虚函数没有函数体;最后的=0不表示函数返回值为0,只起形式作用;

2.抽象类

含有纯虚函数的类就是抽象类

只用来派生,不用来生成定义对象

四、结论

1.某基类包含一个或多个纯虚函数,就是抽象类

2.抽象类一般不是现实存在的对象的抽象

3.在类的层次结构中,顶层或最上面几层都可以是抽象类

4.抽象基类是本类族的共用接口,或者说是从同一基类派生出的多个类有同一接口,因此,能响应同一形式的消息。

5.如果基类声明了虚函数,则在派生类中出现首部相同的函数均为虚函数(默认)

6.使用虚函数提高了程序的可扩展性。

给人笔记,仅供参考,欢迎指教!

未经允许,请勿转载!

时间: 2024-10-11 20:49:20

第十二章 多态性与抽象类的相关文章

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成

第十六章 多态性

相同函数名具有多态性: ①  译时的多态(由函数名来调用时体现):重载:同类,不同参 ②  运行时的多态(用指向不同类的指针来调用): 覆盖:  不同类,同参,基类有virtual(由指针的类型来决定,体现了多态性) 隐藏:①不同类,同参,基类无virtual②不同类,不同参(不论有无virtual)(由指针来决定,不能体现多态性) 1.  为什么要使用多重继承 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数.C++多态性是通过虚函数(virtual)来实现的. 2.

第十二章 继承

第十二章 继承 1.  什么是继承和派生? 继承: 派生: 2.  复杂的继承和派生. 3.  继承和派生如何在C++中实现. 4.  单一继承. 在实际应用中可以将 基类和派生类视为一个整体 5.  保护成员. 封装的含义: 为了解决这个问题我们引进了protected. 6.  公有派生的公有成员. 子类可以直接调用 7.  公有派生的保护成员. 子类可以通过自己间接访问 8.  公有派生的私有成员. 子类只能通过父类间接访问 在派生类中对基类成员的访问限定 其中public protect

C和指针 (pointers on C)——第十二章:使用结构和指针

第十二章 使用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每个节点包含一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的第1个节点.单链表只能从一个方向遍历. 如何insert单链表:1.新节点的link字段必须设置为指向它的后面节点.2.前一个节点的link字段必须指向这个新节点. 为了防止可能会插入链表的起始位置这种情况,在C中,可以保存一个指向必须进行修改的link字段的指针,而不是保存一个指向前一个节点的指针.

《构建之法》第十一、十二章学习总结

第十一章的内容是软件设计与实现. 在第一节中,讲的是关于分析和设计方法,向我们介绍在"需求分析"."设计与实现"阶段."测试""发布"阶段该搞清楚的问题. 在第二节中,讲的是关于图形建模和分析方法.在表达实体和实体之间的关系时,可以用到思维导图(Mind Map).实体关系图(ERD).UCD ;在表达数据的流动时,可以用到DFD工具:在表达控制流的时候可以用到FSM工具:前面提到的这些图形建模方法各有特点,UML却可以有一个

C primer plus 第五版十二章习题

看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: 1 /* global.c --- 使用外部变量 */ 2 #include <stdio.h> 3 int units = 0; //一个外部变量 4 void critic(void); 5 int main(void) 6 { 7 extern int units; 8 9 printf ("How many pounds

构造之法第十一、十二章

第十一章 软件设计与实现 图形建模和分析方法 1表达实体和实体之间的关系(思维导图) 2实体关系图 3Use Case Diagram 表达数据的流动 (1)和管理机构相关的数据流 (2)和读者相关的数据流 (3)和新书入库相关的数据流 (4)和时间相关的数据流 表达数据的流动 (1)和管理机构相关的数据流 (2)和读者相关的数据流 (3)和新书入库相关的数据流 (4)和时间相关的数据流 其他设计方法 1.形式化的方法 2.文学化编程 第十二章 用户体验 用户体验的要素 1.用户的第一印象 2.

JavaScript DOM编程艺术-学习笔记(第十二章)

第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③css -  base.css用于引入使用的css文件 color.css  - 用于设置样式 layout.css - 用于设置布局 Typography.css - 用于设置版式 3.题外话:①在实际开发中,即使是一个空白项目也往往不会从一无所有做起,而借助的平台一般会提供目录结构,所以需要把自己

R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验

第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被随机分配到其中一种条件(A或B)中,相应的结果变量(score)也已经被记录.实验结果如下: 如果两种处理方式真的等价,那么分配给观测得分的标签(A处理或B处理)便是任意的.为检验两种处理方式的差异,我们可遵循如下步骤: (1) 与参数方法类似,计算观测数据的t统计量,称为t0: (2) 将10个得