我要投搞

标签云

收藏小站

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

当前位置:六合图库 > 多态逻辑 >

浅谈C++多态性

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

  多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(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的博客

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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++引入多态的目的是什么”的问题,请高手们来说说。谢谢。论坛

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

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

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

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

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

  1.多态的概念与分类多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征。多态字面意思为多种状态。在面向对象语言中,一个接口,多种实现即为多态。C++中的多态性具体体现在编译和运...博文来自:Dablelv的博客专栏

  编程中我们尽量少用switch语句,使用switch语句会出现大量重复代码,我们可以采用java的多态特性,使用state模式来替换switch语句,具体方式如下:  举个例子,假设一个电影租赁的...博文来自:chens616的专栏

  实现多态有两种方法:1、覆盖***********覆盖是指子类重新定义父类的虚函数的做法。2、重载***********重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数...博文来自:小凡的专栏

  1.用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。2.存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的...博文来自:pzhw520wlim的博客

  主要就是以点作为目标来考虑,而不是以边进行考虑。博文来自:8rfuz的博客

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

  C++多态性:简单理解“一个接口,多种方法”。“允许将派生类类型的指针赋值给基类类型的指针”将基类指针指向派生类对象,通过基类指针调用派生类的成员函数来执行不同的操作。C++多态性的实现方法:C++多...博文来自:q2214543299的博客

  社会化推荐 本文是论文《一种结合推荐对象间关联关系的社会化推荐算法》的笔记(下)。该论文提出的算法是以PMF为框架基础的。因而若对PMF不太了解的话,可以参考我的上一篇文章脑补一下,当然,那篇文章只是...博文来自:雨石

  普通流视频(完整视频) 高清视频(分段视频) 1080P-fhd,超...博文来自:专注于互联网架构技术,努力成为一名架构师

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  以前在windows下用的mysql都是通过下载exe格式的安装包来安装使用,今天偶然下到一个免安装版本的,使用了一番,对mysql的启动之类的有了一个重新认识,记录下。 mysql-5.6.16-w...博文来自:fzhmoive的专栏

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

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  在之前完成了《C++开发人脸性别识别教程》系列博客的编写之后,我开始将工作重点转移到与我的研究生课题关联更为密切的深度学习上来。深度学习编程有几个经典的框架,首屈一指的当属Caffe,然后还有Ma...博文来自:陈俊岭的程序员之路

  好久没上csdn了, 在这里特别想念大家, 最近公司一段时间忙吧,无暇东顾。扫噶,还是直接进入主题吧      大家都知道 直接从google down下来的 zxing二维码扫描 是 在扫描界面 ...博文来自:chonbj的专栏

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

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  此处仅以VS2010为例,详细说明一下如何在VS环境下生成和使用C++的静态库与动态库。Qt下生成和使用静态和动态库后续再讲。 本文仅供初学者参考,如果有问题欢迎大家指正。        首先简单地理...博文来自:luyan的博客

  fragment是大家项目都会用到的,一般都是用来做选项卡的切换,这里记录一下使用fragment出现的错误以及解决办法。 错误信息1: 07-29 10:11:40.009: ERROR/And...博文来自:想你依然心痛的博客

本文链接:http://lcvam.com/duotailuoji/407.html