网站大量收购闲置独家精品文档,联系QQ:2885784924

C++模板隐式接口与编译期多态.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C模板隐式接口与编译期多态

C++ 模板隐式接口与编译期多态 了解隐式接口和编译期多态 Understand implicit interfaces and compile-time polymorphism 面向对象编程世界总是以显示接口(explicit interfaces)和运行期多态(runtime polymorphisim)解决问题。举个例子,给定一个类class: class Widget{Public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap( Widget other); ... } ; 和这样的函数: void doProcessing(Widget w) { if(w.size() 10 w != someNastyWidget) { Widget temp(w); temp.normalize(); temp.swap(w); } } 我们可以这样说doProcessing内的w: ? 由于w的类型被声明为Widget,所以w必须支持Widget接口。我们可以在源码中找出这个接口(例如在Widget的.h文件中),看看它是什么样子,所以我称此为一个显式接口(explicit interface),也就是它在源码中明确可见。 ? 由于Widget的某些成员函数是virtual,w对那些函数的调用将表现出运行期多态(runtime polymorphism),也就是说将于运行期根据w的动态类型决定究竟调用哪一个函数。 Templates 及泛型编程的世界,与面向对象有根本上的不同。在此世界中显式接口和运行期多态依然存在,但是重要性降低。反倒是隐式接口(implicit interfaces)和编译期多态(compile-time polymorphism)移到前头了。若想知道那是什么,看看当我们将doProcessing从函数转变成函数模板(function template)时发生什么事: Templatetypename T void doProcessing(T w) { If(w.size() 10 w != somNastyWidget) { T temp(w); temp.normalize(); temp.swap(w); } } 现在我们怎么说doProcessing内的w呢? ? w必须支持哪一种接口,系由template中执行于w身上的操作来决定。本例看来w的类型T好像必须支持size,normalize和swap成员函数、copy构造函数(用以建立temp)、不等比较(inequality comparison,用来比较someNasty-Widget)。我们很快会看到这并非完全正确,但对目前而言足够真实。重要的是,这一组表达式(对此template而言必须有效编译)便是T必须支持的一组隐式接口(implicit interface)。 ? 凡涉及w的任何函数调用,例如operator 和operator != ,有可能造成template具现化(instantiated),使这些调用得以成功。这样的具现行为发生在编译期。“以不同的template参数具现化function template”会导致调用不同的函数,这便是所谓的编译期多态(compile-time polymorphism)。 纵使你从未使用过templates,应该不陌生“运行期多态”和“编译期多态”之间的差异,因为它类似于“哪一个重载函数该被调用”(发生在编译期)和“哪一个virtual函数该被绑定”(发生在运行期)之间的差异。显式接口和隐式接口的差异就比较新颖,需要更多更贴近的说明和解释。 通常显式接口由函数的签名式(也就是函数名称、参数类型、返回类型)构成。 例如Widget class: class Widget { Public: Widget(); virtual ~Widget(); virtual std::size_t() size() const; virtual void normalize(); void swap(Widget other); }; 其public接口由一个构造函数、一个析构函数、函数size,normalize,swap及其参数类型、返回类型、常量性(constnesses)构成。当然也包括编译器产生的copy构造函数和copy assignment操作符。另外也可以包括typedefs,以及你所选择的public成员变量。 隐式接口就完全不同了。它并不基于函数签名式,而是由有效表达式(valid expressions)组成。再次

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档