模板实现静态多态提供乐橙国际,恒峰娱乐官网平台等产品欢迎广大商家洽谈业务合作

恒峰娱乐官网平台

模板实现静态多态


来源:乐橙国际 | 时间:2019-02-05

  说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了。相信很多程序员代码K多了,做梦都在“多态中”运行着。常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别,我们姑且把这种多态称为“动态多态”或”运行期多态“,而本文总主要想讨论下“静态多态”,也可以叫“编译期多态”,同时一起来看下,静态多态会给我们带来哪些惊喜之处,拭目以待吧。

  这里实现的关键是SelfCast函数,通过static_cast把当前对象强制转换为具体指定的子类对象,这里是Derived1。其实实现的原理很简单,不难理解,我们需要重点讨论的是,这么样实现的多态跟常规虚函数的做法到底有什么不同,有什么优势?

  具有虚函数的class类型都需要一张虚函数表,而每多一个虚函数,对应类型的对象的大小就会增加4bytes

  (32位机器下),夸张的试想一下如果有10个父类,每个父类都有100个虚函数的情况下,每个对象会增加多少?

  每个虚函数的调用在时间上都会比普通函数多一次整形加法和一次指针间接引用,也就是时间上的开销

  这种开销虽然在绝大多数的应用中都是可以忽略不计的,但是总会存在一些对性能与开销无比在意的关键代码。

  根据28法则,应用中80%的时间都是在运行其中20%的代码,那么有时候对这20%代码的优化也许会带来显著的改善。

  回到正题,我们把传统的实现方式称为动态多态,而模板方式的实现则是静态多态,归纳下他们的区别:

  动态多态的实现需要更多空间上的开销,每个对象会因为一个虚函数而增加4bytes,静态多态则没有这个问题

  虚函数的调用在时间上都会比普通函数多一次整形加法和一次指针间接引用,静态多态中的调用则跟普通函数的调用开销相同

  动态多态(虚函数)是C++编译器内置支持的一种实现方式,而静态多态则会额外带来一些使用的复杂性

  动态多态中虚函数不能通过内联来优化执行效率,而静态多态中则可以通过内联来进一步优化函数执行效率

  综上所述,在实际使用中,到底选择哪种实现方式,要因需而异,如果没有特别的性能需求时,完全没有必要为了写的更酷而去使用模版的方式来实现,反而得不偿失,但如果针对特别需求或关键性能的代码,则可以考虑这种优化。

   BasicDerived::Name()

  也就是说针对某些希望定义为static的函数,当你希望能在基类抽象方法中根据当前对象具体类型来使用子类相应static函数时,如上方法可以达成你的目的,这未尝不是一种不错的实现方式。

  多态性(polymorphism)是面向对象程序设计的一个重要特征。在面向对象方法中,一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。在C++中,多态性表现形式...博文来自:zcmlimi的专栏

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

  一.静态多态1.何为静态多态?又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数。例如:函数重载,通过类成员运算符指定的运算。2.示例代码函数重载示例:classA{public:A(){...博文来自:liushall

  多态多态按字面的意思就是多种形态,相同的方法调用,但是有不同的实现方式。多态性可以简单地概括为“一个接口,多种方法”。C++有两种多态形式:静态多态动态多态静态多态静态多态:也称为编译期间的多态,编译...博文来自:江城的博客

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

  同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。可以用不同的方式实现组件中的多态性:接口多态性。继承多态性。通过抽象类实现...博文来自:C# 移动手机应用

  面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。应用形式上:静多态是发散式的,让相同的实现代码应用于不同的场合。动多态是收敛式的,让不同的实现代码应用于相同...博文来自:John_62的博客

  1.多态定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。2.如何实现多态:C++中的多态只能通过指向基类类型的指针和引用来...博文来自:小胖墩

  多态,顾名思义“多种状态”,在面向对象语言中,接口的多种不同实现方式即为多态。 也就是允许将子类类型的指针赋值给父类类型的指针。classA{public:A();virtualvoidk(){qDe...博文来自:Galwayy的博客

  为什么会有虚函数的出现呢?这就不得不提到多态了多态:专业的术语说就是:同一个实现接口,使用不同的实例而执行不同的操作。而简单的来说同一个事物的不同体现,比如我是老师的学生,是爸爸妈妈的女儿。多态有什么...博文来自:a的博客

  多态面试题集锦什么是多态答:多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“多态的作用答:多态技术允许将父类设置成和他的一个或更多的子对...博文来自:阿亮的博客

  1,同一操作作用于不同的对象,同一接口可产生不同的结果2,有两种多态:一种是编译时期多态又叫静态多态,编译时期的多态是靠重载实现的,根据参数个数,类型和顺序决定的(必须在同一个类中)另一种是运行时的多...博文来自:weixin_42720316的博客

  文章总结自牛客网的评论。、虚函数的作用:简单讲...博文来自:caogenwangbaoqiang的博客

  说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了。相信很多程序员代码K多了,做梦都在“多态中”运行着。常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别...博文来自:my_business的专栏

  表面上看:模板与多态本身就是两个东西。模板实例化是发生在编译期(Compile-time)的,而多态中的函数调用决议是发生在运行时(Run-time)。实际上:模板是静多态,模板是在编译时确定的,而平...博文来自:DIYing

  CRTP指的是CuriouslyRecurringTemplatePrattern,这是一种可以实现静态多态的惯用法。我们知道C++中,你不能将基类的虚函数定义为模板函数。这时你就可以考虑使用CRTP...博文来自:xcyl的口袋

  StaticandDynamicPolymorphisminC++ 多态是 C++中面向对象技术的核心机制之一包含静态多态和动态多态它们之间有一定的相似性述了这种相似性并重点论述了以模板实现的静态多态...博文来自:Chen_Yilong的专栏

  多态总结:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的...博文来自:的博客

  目录第14章模板的多态威力14.1动多态14.2静多态14.3动多态和静多态14.3.1术语14.3.2优点和缺点第14章模板的多态威力多态是一种能够令单一的泛型标记关联不同特定行为的能力。对面向对象...博文来自:u012481976的博客

  文章来源熟悉模板编程的朋友或许听到过这个技巧或者模式:Barton-Na...博文来自:杨德龙的专栏

  多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯...博文来自:lsm307742191的专栏

  这是前不久做的一道关于静态成员与静态方法特性的题,真的不做下题都不知道自己的基础究竟是有多浅薄,当然这里指对多态的理解一、先回顾下静态成员与静态变量吧,static关键字参考书籍《Java编程思想》参...博文来自:纸上得来终觉浅 绝知此事要躬行

  综述多态性是面向对象程序设计的一个重要特征。在C++语言中,多态指的是:具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。C++的多态分为两种:1.静态多态性(编译时多态):在...博文来自:晏九的博客

  参考资料:多态具体表现形式有两种:方法的重写和方法的重载。先来看一段程序(此段代码摘自...博文来自:zlp1992的专栏

  C++静态多态性C++静态多态性包括函数重载与缺省参数,运算符重载,宏多态,类的早起绑定。注意C语言没有重载机制。函数重载要深入理解函数重载需要了解下列几个问题:-什么是函数重载-为什么需要函数重载-...博文来自:u014630623的专栏

  C++多态有两种形式,动态多态和静态多态;动态多态是指一般的多态,是通过类继承和虚函数机制实现的多态;静态多态是通过模板来实现,因为这种多态实在编译时而非运行时,所以称为静态多态。动态多态例子:#in...博文来自:mitirender的专栏

  多态性:        多态性就是多种表现形式,具体来说,可以用一个对外接口,多个内在实现方法表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆...博文来自:fengyunjh的专栏

  多态的字面含义:具有多种不同的形态。关键字:重载/模版和虚函数类型:编译期多态(静态多态,早绑定)和运行期多态(晚绑定)编译期多态(重载/模版):重载intgetMax(intparam1,intpa...博文来自:coderchen

  静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。java的多态机制遵循一个原则:当父类对象引用变量引用子...博文来自:新一难的博客

  多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯...博文来自:Chen_Yilong的专栏

  在C++中我们一般采用虚函数的方式实现函数的多态性,动态联编实现运行期绑定。实际上我们也可以用模板来实现函数的多态性,这在ATL中大量使用的,请看如下的代码:templatetypename T,typena...博文来自:longlong_ago的专栏

  多态(静态多态+动态多态)多态是面向对象的三大特征(封装,继承,多态)之一。教科书定义:指相同对象接收不同消息或不同对象接到相同消息产生不同的动作。简单来说就是当发出一条命令时,不同的对象接收到同样的...博文来自:Rocky0429

  “在多态中对于普通方法:编译时看左边,运行时看右边。对于静态方法:编译、运行都看左边对于成员变量:编译、运行看左边”对于静态方法:编译、运行都看左边为什么对于静态方法,无论是编译还是运行,都是根据基类...博文来自:cldance的博客

  多态性是指不同的对象收到相同的信息是,产生不同的行为。C++中可以用同一个函数名调用不同内容的函数,这些函数执行不同但又类似的操作,这样就可以用同一个函数名调用不同内容的函数。一个源程序经过编译,连接...博文来自:凌宫凉的博客

  动态语言的多态和静态语言c++等多态含义不太一样,c++中的多态就是参数数量和类型不同的方法就是不同方法,而动态语言中的多态其实值的是方法的寻找过程,即向右找到类(或者单件类),在类中找不到的话再找父...博文来自:Machine Learning with Peppa

  本文通过一段简单的代码来阐释,java中的静态方法并不具备多态性。博文来自:发烧的冬瓜的博客

  在调用一个函数的时候,当参数是基类的时候,有时候传子类对象也是能够正常运行;在调用模板函数的时候,模板有时候能够自动推导出参数的类型,得到理想的结果,但是很多时候模板参数并不会按我们想象的那样进行推导...博文来自:hll174

  运行时多态的实现-虚函数多态分为编译时多态和运行时多态;编译时多态为重载和模板,运行时多态是通过虚函数实现的。例如我们看下面一个例子:我们定义一个指向基类的指针,但是我们希望通过对于不同的对象可以有不...博文来自:Zhoujy1996的博客

  多态:即多种形态。对不同对象发送同一消息,不同对象会做出不同的响应。多态分为静态多态和动态多态。1.静态多态:静态多态又称编译期多态:是指在**编译阶段就知道程序执行到这里接下来会执行哪个函数。**例...博文来自:sophia__yu的博客

  静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。java的多态机制遵循一个原则:当父类对象引用变量引用子...博文来自:HMYANG314的专栏

  静态的概念经常出现在java程序中,系统自带类中的大部分函数是静态函数。静态static可以用来修饰属性、方法、代码块。在类中static修饰的变量可以被该类创建的所有对象共同使用。而不用static...博文来自:DT_Zhangshuo的博客

  多   态   1、动态多态的实现原理  2、多态的类别及实现方法  3、动态多态的四种情况(2)多态的类别及实现方法2.1静态多态:编译时多态、函数的多态性,重载、模板、宏2.2动态多态:运行时多态...博文来自:小明同学的博客

  本质上多态分两种:1、编译时多态(又称静态多态)2、运行时多态(又称动态多态)...博文来自:jason_cuijiahui的博客

  什么是多态?多态是C++编程时的一种特性,多态性即是对一个接口的多种实现。多态可以分为静多态和动多态。所谓静多态就好比函数重载、模板,静多态是在函数编译阶段就决定调用机制,即在编译连接阶段就将函数的入...博文来自:magic_world_wow的博客

  1:群体数据自定义类型的数据由多个基本类型或者自定义类型的元素所组成,被称为群体数据。2:参数化多态将程序所处理的对象的类型参数化,使得一段程序可以用于处理多种不同类型的对象。模板就是C++支持参数化...博文来自:ivalue的博客

  (草稿版) 视频演示地址:PART1-第一步、准备工作 (1)设置远程连接Ubuntu root账户 ap...博文来自:u011298145的博客

  分页实现的效果:      /**/ 组图0-1.分页实现效果图一       /**/ 组图0-2.分页实现效果图二 一、从效果可以看出内容由两部分组成: 1.学生信息     数据库中插入一些记录...博文来自:niaonao

  如图,这个错误使无数玩家烦恼。             出现这个错误,可能是硬件的问题,也可能是软件的问题。但是,由于硬件引起该问题的概率很小,并且除了更换硬件之外没有更好的解决方法...博文来自:VBcom的专栏

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

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

相关www.7108n.com

    无相关信息