多态是面向对象的程序设计的关键技术。多态:调用同一个函数名,可以根据需要但实现不同的功能。多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数)。

  运行时多态:运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定。

  前面我们在介绍继承的时候,通过基类的指针或引用指向派生类对象后,调用派生类和基类中同名的方法的时候,调用的均是基类的成员,不能访问派生类的成员。这是在运行之前就可以确定的,而要实现运行时的多态,我们要通过虚函数来实现。

  多态使用

  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++多态详解的更多相关文章

  1. “全栈2019”Java第五十四章:多态详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  3. 18.Java 封装详解/多态详解/类对象转型详解

    封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...

  4. 【转】java多态详解

    1.        Java中除了static和final方法外,其他所有的方法都是运行时绑定的.private方法都被隐式指定为final的,因此final的方法不会在运行时绑定.当在派生类中重写基 ...

  5. [置顶] JAVA从零单排4-----继承、封装和多态详解

    继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...

  6. java之多态详解

    前言 什么叫多态?多态就是一种事物可以有多种表现形式 多态三要素 1.被动方必须有继承关系 2.子类一般都要重写父类方法 3.必须将主动方的功能函数的参数设置为 被动方父类的类型 举个例子司机开车 假 ...

  7. c# 中的封装、继承、多态详解

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  8. C++ 多态详解及常见面试题

    今天,讲一讲多态: 多态就是不同对象对同一行为会有不同的状态.(举例 : 学生和成人都去买票时,学生会打折,成人不会) 实现多态有两个条件: 一是虚函数重写,重写就是用来设置不同状态的   二是对象调 ...

  9. Java多态详解

    package QianFeng02; //多态 public class Polymorphic { public static void main(String[] args){ // HomeC ...

随机推荐

  1. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  2. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. Android GridView 通过seletor 设置状态和默认状态

    Android中可以通过selector控制GridView Item 的状态,而省去使用代码控制 GridView View Selector Xml文件 <?xml version=&quo ...

  4. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  5. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  6. jQuery的属性

    The Write Less , Do More ! jQuery的属性 1. attr(name|properties|key,value|fn) : 设置或返回被选元素的属性值 ①获取属性 < ...

  7. WebLogic的安装和配置以及MyEclipse中配置WebLogic

    WebLogic 中间件: 是基础软件的一大类,属于可复用软件的范畴,顾名思义,中间件属于操作系统软件与应用软件的中间,比如:JDK,框架,weblogic. weblogic与tomcat区别 : ...

  8. PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.

    PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...

  9. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  10. Android 算法 关于递归和二分法的小算法

     // 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...