C++多态详解
多态是面向对象的程序设计的关键技术。多态:调用同一个函数名,可以根据需要但实现不同的功能。多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数)。
运行时多态:运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定。
前面我们在介绍继承的时候,通过基类的指针或引用指向派生类对象后,调用派生类和基类中同名的方法的时候,调用的均是基类的成员,不能访问派生类的成员。这是在运行之前就可以确定的,而要实现运行时的多态,我们要通过虚函数来实现。
多态使用
1.若要访问派生类中相同名字的函数,必须将基类中的同名函数定义为虚函数,基类的指针指向派生类对象后, 就可以调用派生类的同名的成员函数。
CCurrentTime currentTime;
CTime *p = ¤tTime;
CTime& time = currentTime;
time.getHour();
在前面我们没有将基类的getHour函数设置为虚函数,所以虽然这是一个包含派生类的对象的基类的引用,它也不能根据我们刚才所说的运行时多态来判断所包含的对象来调用该类的getHour函数,只会根据基类的这是一个基类的引用来调用基类的getHour函数,指针也是一样。
1)将基类同名的函数定义为虚函数可以使用C++关键字virtual来实现。在基类成员函数声明前加virtual关键字。
2)在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数 。
在程序的执行过程中,依据指针具体指向哪个类对象,或依据引用哪个类对象,才能确定绑定哪个成员函数,实现动态绑定。
注意:
1)当在基类中把成员函数定义为虚函数后,在其派生类中定义的虚函数必须与基类中的虚函数同名,参数的类型、顺序、参数的个数必须一一对应,若函数名相同,但参数的个数不同或者参数的类型不同时,则属于函数的重载,而不是虚函数。若函数名不同,显然这是不同的成员函数。
2)实现这种动态的多态性时,必须使用基类类型的指针变量,并使该指针指向不同的派生类对象,并通过调用指针所指向的虚函数才能实现动态的多态性。通过对象名访问虚函数则不会实现动态多态性。
3)在派生类中没有重新定义虚函数时,与一般的成员函数一样,当调用这种派生类对象的虚函数时,则调用其基类中的虚函数。
4)可把析构函数定义为虚函数,但是,不能将构造函数定义为虚函数。构造函数不能被继承,每一个类都需要自己的构造函数来初始化对象。当派生类的对象销毁的时候,先调用派生类的析构函数,再调用基类的析构函数,如果基类的析构函数不是虚函数,在对基类的指针或者引用进行销毁的时候,调用的就是基类的析构函数,没有调用派生类的析构函数,一般的情况下这是没有问题的。但是我们如果需要在派生类的内部执行一些必要的清理工作,比如释放一些占用的内存,或者释放占用线程的锁,这个时候不调用派生类的析构函数就会导致内存泄漏。我们一般讲基类的析构函数设置为虚函数。
5)多态时通过虚函数动态绑定实现。内部则是通过虚函数表实现。调用时的执行速度要慢。虚函数表是一张表,其内部存储很多虚函数的地址。基类对象有一张,子类也有一张,初始时子类继承基类的表,若子类覆盖(重写)了基类的虚函数,则将子类的虚函数表对应项目替换为子类虚函数指针。
这个大家先大概了解,随着理解的加深,可以深入学习一下。
原文链接:http://www.maiziedu.com/wiki/cplus/forms/
C++多态详解的更多相关文章
- “全栈2019”Java第五十四章:多态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- 18.Java 封装详解/多态详解/类对象转型详解
封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...
- 【转】java多态详解
1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的.private方法都被隐式指定为final的,因此final的方法不会在运行时绑定.当在派生类中重写基 ...
- [置顶] JAVA从零单排4-----继承、封装和多态详解
继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...
- java之多态详解
前言 什么叫多态?多态就是一种事物可以有多种表现形式 多态三要素 1.被动方必须有继承关系 2.子类一般都要重写父类方法 3.必须将主动方的功能函数的参数设置为 被动方父类的类型 举个例子司机开车 假 ...
- c# 中的封装、继承、多态详解
面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...
- C++ 多态详解及常见面试题
今天,讲一讲多态: 多态就是不同对象对同一行为会有不同的状态.(举例 : 学生和成人都去买票时,学生会打折,成人不会) 实现多态有两个条件: 一是虚函数重写,重写就是用来设置不同状态的 二是对象调 ...
- Java多态详解
package QianFeng02; //多态 public class Polymorphic { public static void main(String[] args){ // HomeC ...
随机推荐
- AngularJs之九(ending......)
今天继续angularJs,但也是最后一篇关于它的了,基础部分差不多也就这些,后续有机会再写它的提升部分. 今天要写的也是一个基础的选择列表: 一:使用ng-options,数组进行循环. <d ...
- InnoDB关键特性学习笔记
插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...
- javascript表单的Ajax 提交插件的使用
Ajax 提交插件 form.js 表单的下载地址:官方网站:http://malsup.com/jquery/form/ form.js 插件有两个核心方法:ajaxForm()和ajaxSubmi ...
- Android带加减的edittext
看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...
- 在Linux系统下运行微信Web开发者工具
微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...
- CSS 3学习——box-sizing和背景
box-sizing 在CSS 2中设置元素的width和height仅仅是设置了元素内容区的宽和高,元素实际的尺寸是margin + border + padding + 内容区. CSS 3(截止 ...
- PHP类和对象之重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...
- 模仿Linux内核kfifo实现的循环缓存
想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...