我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩66彩票 > 多态逻辑 >

浅谈C++多态性

归档日期:05-29       文本归类:多态逻辑      文章编辑:爱尚语录

  多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。

  C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题。但这并没有体现多态性。

  多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。

  那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

  最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

  第二个输出结果就是1、4。p-foo()和p-fuu()则是基类指针指向子类对象,正式体现多态的用法,p-foo()由于指针是个基类指针,指向是一个固定偏移量的函数,因此此时指向的就只能是基类的foo()函数的代码了,因此输出的结果还是1。而p-fun()指针是基类指针,指向的fun是一个虚函数,由于每个虚函数都有一个虚函数列表,此时p调用fun()并不是直接调用函数,而是通过虚函数列表找到相应的函数的地址,因此根据指向的对象不同,函数地址也将不同,这里将找到对应的子类的fun()函数的地址,因此输出的结果也会是子类的结果4。

  问这两调用的输出结果。这是一个用子类的指针去指向一个强制转换为子类地址的基类对象。结果,这两句调用的输出结果是3,2。

  并不是很理解这种用法,从原理上来解释,由于B是子类指针,虽然被赋予了基类对象地址,但是ptr-foo()在调用的时候,由于地址偏移量固定,偏移量是子类对象的偏移量,于是即使在指向了一个基类对象的情况下,还是调用到了子类的函数,虽然可能从始到终都没有子类对象的实例化出现。

  而ptr-fun()的调用,可能还是因为C++多态性的原因,由于指向的是一个基类对象,通过虚函数列表的引用,找到了基类中fun()函数的地址,因此调用了基类的函数。由此可见多态性的强大,可以适应各种变化,不论指针是基类的还是子类的,都能找到正确的实现方法。

  本来仅仅区别重载与覆盖并不算困难,但是C++的隐藏规则使问题复杂性陡然增加。

  (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual

  (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual

  纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

  2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

  为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

  指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。

  虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override)

  包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

  什么是多态?顾名思义就是同一个事物,在不同场景下的多种形态。下面会具体的详细的介绍。...博文来自:的博客

  C++特性详解 C++分为三大特性:_封装、_继承、_多态  _封装: 类是面向对象程序设计语言中的一个概念。类是对某个对象的定义。包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。 封装的...博文来自:skySongkran的博客

  在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码。此外,使用多态也能起到精简代码的作用。本节通过游戏实例来说明多态的作用。游戏程序实例游戏软...博文来自:u010894131的博客

  一、类继承    C++是一种面向对象的语言,最重要的一个目的就是——提供可重用的代码,而类继承就是C++提供来扩展和修改类的方法。类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以...博文来自:帅气的羊的博客

  多态性包括:*重载--包含多态*强制--强制多态*虚函数--抽象多态*模板--参数多态*编译时多态:静态多态*运行时多态:动态多态一.虚函数虚函数是c++实现动态多态性的机制,通过虚函数可以使基类和派...博文来自:的博客

  C++多态性有哪些?   概念:指相同的对象收到不同的消息或者不同的对象收到相同的消息时产生的不同的实现动作。C++支持两种多态:编译时多态(静态)、运行时多态(动态)(1)编译时多态:就是在编译期确...博文来自:YF_Li123的博客

  C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。多态性可以...博文来自:wangjian530的博客

  C++的多态性分为类的多态性和函数的多态性类的多态性---通过虚函数实现1、如果基类中的函数f()没有virtual,在派生类中重写此函数,用派生类的指针引用a,去初始化基类的引用或指针b时,b指向的...博文来自:的博客

  1.C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。2.多态性可以简单地概括为...博文来自:MarkHome

  多态编译环境:VS2013一、对象类型在引入多态之前,我们先来看一下对象类型 二、多态性的概念     多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对...博文来自:eagle_007WH的博客

  在任何一门面向对象的编程语言中,多态性(polymorphism)都是非常重要的一个概念。在面向对象的三大元素中,封装使代码的模块化变得简单,继承则可以扩展已有的代码,而多态则是为了满足接口的重用。所...博文来自:lzw刘仔很忙的博客

  C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本...博文来自:拂晓123的博客

  最近复习到了C++的多态性,我想把多态性的一些知识点进行下梳理总结。本文所有代码均在windows10的VS2013平台上测试什么是多态?多态性(polymorphism)据说最早源自希腊语,从字面上...博文来自:xy913741894的博客

  一、多态1、概念:同一事物表现出的多种形态,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。2、举例子:#include&a...博文来自:Paranoid_cc的博客

  根据清华大学郑莉老师的书《C++语言程序设计》来总结1多态:是指类中具有相似功能的不同函数,使用同一个名称来实现;是对类的行为再抽象;多态是通过重载函数和虚函数来实现的。2继承讨论的是类与类的层次关系...博文来自:chenxl929的博客

  2018/5/131.说在前面:项目大体上解决了,现在可以腾出时间来优化项目和学习新的知识2.C++多态性1.简述:(多态)polymorphism       对于C++的多态性,这是一项很灵活的技...博文来自:Lzinner的博客

  C++的多态是面向对象编程的核心,那么C++的多态是怎么来实现的?今天我们就来探讨一下。我们先来看下面程序和它的运行结果#includelt;iostreamgt;usingnam...博文来自:的博客

  文章概述1.多态出现的背景(赋值兼容性原则遇上函数重写);2.多态理论联系实际;3.多态成立的3个条件;4.多态的理论基础;5.多态的C++实现以及多态的实现效果;6.虚析构函数;多态出现的背景(赋值...博文来自:小白的博客

  多态是指同样的消息被不同类型的对象接收时导致不同的行为。面向对象的多态可以分为4种:(1)重载多态:包括C++中的函数重载以及运算符重载(实际上也是函数重载);(2)强制多态:例如浮点数与整型数相加时...博文来自:lhanchao的博客

  多态是面向对象编程语言的重要特征,C++多态表现形式主要有函数重载,运算符重载和虚函数等,其中函数重载和运算符重载是静态多态(函数的调用在编译器编译期间就可以确定函数的调用地址,并生产代码,即为静态多...博文来自:vivien1997的博客

  概念多态性可以简单的概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。实现方法C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义...博文来自:syeming的编程专栏

  C++封装继承多态总结面向对象的三个基本特征面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。...博文来自:ruyue_ruyue的专栏

  C++支持两种多态性:编译时多态性(静),运行时多态性(动)。a.编译时多态性:通过重载函数实现b 运行时多态性:通过虚函数实现。 ...博文来自:MonkeyMonkeyGo

  联系人:石虎 昵称:嗡嘛呢叭咪哄            群称:iOS技术交流学习群一、概念1.定义:“一个接口,多种方法”,程序在运行时才决定调用...博文来自:石虎

  一、多态的概念      多态就是多种形态,C++的多态分为静态多态与动态多态。静态多态就是重载,因为在编译期决议确定,所以称为静态多态。在编译时就可以确定函数地址。动态多态就是通过继承重写基类的虚函...博文来自:Demons的博客

  什么是多态??1.多态性(polymorphism)据说最早来自希腊语,从字面上理解就是多种形态,多种形式。具体到C++这种面向对象的语言(OOP)中,其实就是一种“接口”,多种实现(方法)。2.多态...博文来自:genzld的博客

  引言    多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。与之相对应的编译时绑定函数称为静态绑定。多态是面向对象编程的核心思想之一,因此我们有必要深入探索一下它的实现原理。理...博文来自:kwanson的博客

  C++多态多态是C++三大特性之一。 简单来说多态就像是“一个接口,多种形态”。多态根据函数地址绑定的先后次序可以分为静态多态和动态多态。静态多态:函数的调用是在编译期间完成的(静态绑定。函数重载)。...博文来自:Atom丶的博客

  多态方式:(1)静态多态(重载,模板)是在编译的时候,就确定调用函数的类型。(2)动态多态(覆盖,虚...博文来自:u010029439的博客

  1.多态的概念  同一种东西在不同场景下的多种形态  比如举个例子:见人说人线.动态多态的分类    1gt;静态多态 静态多态是编译器在编译期间完成的,编译器根据函数实参的类...博文来自:缥缈烟雨

  C/C++多态及其实现原理多态的介绍多态含义为一个事物有多种形态。在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。一般来说多态分为两种:静...博文来自:hycxag的博客

  单继承amp;多继承前面介绍的是单继承,即一个类是从一个父类派生而来的。但实际上,常常有这样的情况,一个子类有两个或多个父类,子类从两个或多个父类中继承所需的属性。单继承:一个子类只有一个直...博文来自:ling_hun_pang_zi的博客

  1.什么是多态?相同对象收到不同消息,产生不同的动作;(静态多态)不同对象收到相同的消息,产生相同的动作;(动态多态)静态多态:(又称为早绑定)比如,我们定义一个矩形类Rect,这个类有两个互为重载的...博文来自:weixin_39059738的博客

  一、题目描述建立三个线程A、B、C,A线次字母A,B线次字母B,C线次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Sync...博文来自:想作会飞的鱼的博客

  前两天面试被问到这个“C++引入多态的目的是什么”的问题,请高手们来说说。谢谢。论坛

  多态:顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函...博文来自:stay_the_course的博客

  参考:C++多态C++多态定义当类之间存在层次结构,并且类之间是通过继承关联时,可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的,类的多态通过虚函数实现。虚函数虚函...博文来自:Bryan_Zhang的专栏

  隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价...博文来自:dragon的专栏

  连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为...博文来自:Napoleon的专栏

  ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节...博文来自:a5882230的专栏

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...博文来自:小平子的专栏

  利用CRC32绕过RAR密码(适合于小文本文件)原文标题:教你绕过rar密码 文章仅作rar密码破解的探讨,如有高见还望提出。 题目有点夸大其词,事实是我也没能想出一个更好的描述来总结这篇文...博文来自:林毅洋

  一、适用场景内存属于稀缺资源,不能随意浪费。如果在一个系统中有很多个完全相同或相似的对象,我们就可以使用享元模式,让他们共享一份内存即可,不必每个都去实例化对象,从而节省内存空间。二、模式核心 享...博文来自:小小本科生成长之路

  原文地址:因为需要用,所以才翻译了这个文档。但总归赖于英语水平很有限,翻译出来的中文有可能...博文来自:ymj7150697的专栏

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  转载请说明原出处,谢谢~~   第三个没有做的是每个显示的背景图的小图的动态外观,原酷狗的背景图的小图标,有normal、hover、down等 多种状态,如图  ...博文来自:Redrain的专栏

  转载请注明出处:     在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容。 公交信息检索     实际上,公交信息检索与POI检索、在线建议检索非常相似,也...

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...

  1.当我们发现无法联网时,我们运行下面命令或者ping命令 ip  addr 结果没有显示局域网的IP地址 2.我们去修改网卡配置文件,把网络连接打开 cd / cd  /etc/sys...

  本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框、发评论,及弹出位置的控制。...

  在最近的项目开发中涉及到一个伴奏和类似K歌的功能,最明显的做法就是将播放器里播放的声音扑捉到缓冲区里与麦克风的声音做混合,然后编码发送出去。这里有个关键环节就是混音。因为是音乐类的声音混合,所以要求尽...

  单机最大的TCP连接数及其修改 一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535” .    65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的...

  田发江的专栏微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...

  jquery/js实现一个网页同时调用多个倒计时(最新的)11-25阅读数 51万+

  深入理解在Android中线天的凌晨时光,这段时间收获很多.(2)从整理文章,作者从线程--阻塞队列--二进制--线程池的内部机制,一路走来,本来是想写一篇为AsyncTask...博文来自:我一直很棒,这个不用质疑

  1、点击打开遮罩层按钮 2、弹出一个隐藏的div 实现代码如下: 影音先锋 -- ...博文来自:简单就是美

  PHP如何获取刚插入数据的ID 和判断SQL语句是否成功执行博文来自:coder_zyz的专栏

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行 sql仅可执行DDL、select、DML等...博文来自:Ape55的博客

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...博文来自:知识小屋

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...博文来自:Tiaaaaa的博客

本文链接:http://chapmanswifts.com/duotailuoji/382.html