科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C++箴言:理解new-handler的行为 (6)

C++箴言:理解new-handler的行为 (6)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

C++箴言:理解new-handler的行为

作者:fatalerror99 来源:Blog 2007年10月27日

关键字: C++ Linux

  • 评论
  • 分享微博
  • 分享邮件
有了这个 class template(类模板),为 Widget 增加 set_new_handler 支持就很容易了:Widget 只需要从 NewHandlerSupport 继承即可。(可能看起来很奇特,但是下面我将解释更多的细节。)

class Widget: public NewHandlerSupport {
 ... // as before, but without declarations for
}; // set_new_handler or operator new

  这些就是 Widget 为了提供一个 class-specific set_new_handler 所需要做的全部。

  但是也许你依然在为 Widget 从 NewHandlerSupport 继承而烦恼。如果是这样,当你注意到 NewHandlerSupport template 从来没有用到它的 type parameter T 时,你可能会更加烦恼。它不需要那样做。我们需要的全部就是为每一个从 NewHandlerSupport 继承的 class 提供一份不同的 NewHandlerSupport ——特别是它的 static data member(静态数据成员)currentHandler ——的拷贝。template parameter T 只是为了将一个 inheriting class 同另一个区分开来。template 机制自己自动地为每一个被实例化的 NewHandlerSupport 中的 T 生成一个 currentHandler 的拷贝。

  对于 Widget 从一个把 Widget 当作一个 type parameter(类型参数)的 templatized base class(模板化基类)继承,如果这个概念把你弄得有点糊涂,不必难受。它最开始对每一个人都有这种影响。然而,它发展成如此有用的一项技术,它有一个名字,虽然它正常看上去所反映的事实并不是他们第一次看到它的样子。它被称作 curiously recurring template pattern(奇特的递归模板模式) (CRTP)。真的。

  在这一点上,我发表了一篇文章建议一个更好的名字叫做 "Do It For Me",因为当 Widget 从 NewHandlerSupport 继承时,它其实是在说:“我是 Widget,而我要从针对 Widget 的 NewHandlerSupport class 继承。”没有人使用我提议的名字(甚至是我自己),但是把 CRTP 考虑成说 "do it for me" 的一种方式也许会帮助你理解 templatized inheritance(模板化继承)在做些什么。

  像 NewHandlerSupport 这样的 templates 使得为任何有需要的 class 添加一个 class-specific new-handler 变得易如反掌。然而,mixin-style inheritance(混合风格继承)总是会导致 multiple inheritance(多继承)的话题,而在我们沿着这条路走下去之前,你需要阅读《C++箴言:谨慎使用多继承》。
查看本文来源DY>
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章