C++动多态和静多态

动多态的设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。客户端的代码(操作函数)通过指向基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到你实际提供的子类对象上去。

静多态的设计思想: 对于相关的对象类型,直接实现它们各自的定义,不需要基类。只是隐式地规定各个具体类的实现中相同功能的接口名要相同。客户端把操作这些对象的函数定义为模板,你需要操作什么类型的对象,直接对模板指定该类型实参即可(或通过实参演绎获得)。

两种多态设计范式的比较:
    (1)动多态的特点:通过继承实现、接口预先在基类中确定、是动态的(运行期绑定接口)。
    优点:能处理异类集合(容器中存储基类指针即可)、可执行代码比较小(只需一个多态函数)、可以完全编译而不需要发布源码。
    缺点:不能提前检查类型的安全性(如向容器中插入错误类型的对象)、性能低(有层层继承)、耦合性高(继承的耦合性高于组合)。
    (2)静多态的特点:通过模板实现(宏也是实现静多态的一种途径)、接口没有预先确定而只是隐式地规定、是静态的(编译期绑定接口)。
    优点:具体类可以只实现需要的接口、生成代码性能高(无需通过指针的间接调用,非虚函数具有更多的内联机会)、有更好的类型安全性(类型在编译期就进行检查)、耦合性低(各个类相互独立)、集合的元素类型不再局限于指针。
    缺点:不能处理异类集合、可执行代码比较大(代码膨胀)、模板库源码需要发布、对模板实参类型有约束(比如需要该类型实现了operator<)。
    现实中我们可以组合两种多态来做设计:从公共基类派生不同的子类,从而能够处理属于异类集合的不同对象。而需要操作具体某种类型的对象时,使用模板来实现。

时间: 2024-10-05 21:10:21

C++动多态和静多态的相关文章

C++ template —— 动多态与静多态(六)

前面的几篇博文介绍了模板的基础知识,并且也深入的讲解了模板的特性.接下来的博文中,将会针对模板与设计进行相关的介绍.------------------------------------------------------------------------------------------------------------与传统的语言构造相比,模板的不同之处在于:它允许我们在代码中对类型和函数进行参数化.把(1)局部特化和(2)递归实例化组合起来,将会产生强大威力.接下来的几篇博文,我们

C++ Primer学习笔记(13)——封装、继承、多态

C++ 是一种典型的面向对象的编程语言,其最显著地特点是封装.继承和多态.充分理解封装.继承.多态是如何实现的,学好C++就不是难事了. 1.封装 封装是将多个细节元素组合在一起,隐藏起来,成为一个类.外部无法了解类内部是如何实现的,只需要考虑它的接口. 例如:将公司员工的姓名.年龄.工号等信息放在类的私有部分. 封装的好处: 避免类内部出现无意的.可能破坏对象状态的用户级错误. 随时间推移可以根据需求改变或缺陷报告来完善类实现,而无需改变用户级代码. 2.继承 该部分转自ruyue_ruyue

面经中高频知识点归纳

网易面经知识点(C++/C研发) 注:由阅读大牛面经整理而成!主要是夯实基础块! 1.多态性都有哪些? C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态:发生在运行期的则是动态绑定,也就是动多态.静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板template

c++学习书籍推荐《C++ Templates》下载

详细讲解C++模板语言的概念. 使用C++模板的常用设计技巧. 应用例证(其中一些是"高 级"应用). 百度云及其他网盘下载地址:点我 名人推荐 如果今年你只打算买一本C++的书,那就选<C++Templates中文版>吧! --JoshWalker,ACCU成员 <C++Templates中文版>是C++世界期待已久的重量级著作. --MarcBriand,C/C++UsersJournal前任总编 一句话,模板圣经已经写就,请研习. --MaximKhesi

C++多态(静多态和动多态)

如今的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都支持多态的概念,但又有所不同.

模板的多态(静多态)威力

多态是一种能够令单一泛型标记关联不同特定行为的能力,对面向对象程序设计而言多态是一块基石.C++中通过继承和虚函数实现在运行期处理这种行为的能力,我们称为动多态.然而模板也允许我们使用这种单一泛型标记来关联不同的特定行为,这种关联是在编译期间进行处理的,我们称之为静多态. 一.概念 动多态:使用继承.虚函数,基类指针实现透明地处理不同类型集合的方法(运行时多态) 静多态:使用模板参数对不同类型集合实现透明地处理的方法(编译时期多态) 二.动多态:通过继承实现的多态是绑定和动态的. 绑定的含义是:

递归与迭代【转】

1 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 1.1 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身: 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 1.2 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解: 2

C++ Primer学习笔记(14)——虚函数的实现机制、纯虚函数

在行文之前查阅了相关书籍,参考了一些别人的博客,在这里谢谢大家的分享!希望自己和大家在学习语言的道路上渐行渐远,一直走下去~~~ 上一篇文章中说道,C++ 的三个基本特质是 封装.继承.多态. 多态性是将接口与实现进行分离.用形象的语言解释就是实现已共同的方法,但因个体差异而采用不同的策略. 多态包括静多态和动多态,分别在编译和运行过程中实现.而动多态是由虚函数来实现的,其实现机制体现了C++的神秘性. 1.虚函数的实现机制 虚函数是那些以 virtual 关键字修饰的成员函数,是用来实现多态的

理清递归、迭代、循环的概念

loop.iterate.traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇.众所周知,这几个词分别翻译为:循环.迭代.遍历和递归.乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思.那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下. 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for语句.大都会娱乐