注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载)模板-继承-具现化  

2016-05-04 10:00:13|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(转载)模板-继承-具现化

标签: classc

http://blog.csdn.net/happymawolf/article/details/6402083 分类:  c++深入思考(10 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

今天在学习effective c++中的第49个条款时,遇到一个模板继承的方法,让我打开眼界,感慨万千啊!

 

具体的代码如下:

 

[cpp] view plain copy

class NewHandlerHolder 

public: 

    explicit NewHandlerHolder(new_handler nh) 

        : handler(nh) {} 

    ~NewHandlerHolder() 

    { 

        set_new_handler(handler); 

    } 

private: 

    new_handler handler; 

}; 

 

template<typename T> 

class NewHandlerSurpport 

public: 

    static new_handler set_new_handler(new_handler) throw(); 

    static void* operator new (size_t size) throw(bad_alloc); 

private: 

    static new_handler currentHandler; 

}; 

 

template<typename T> 

new_handler NewHandlerSurpport<T>::set_new_handler(new_handler p) throw() 

    new_handler oldHander = currentHandler; 

    currentHandler  = p; 

    return oldHander; 

 

template<typename T> 

void* NewHandlerSurpport<T>::operator new (size_t size) throw(bad_alloc) 

    NewHandlerHolder h(std::set_new_handler(currentHandler)); 

    return ::operator new(size); 

 

template<typename T> 

new_handler NewHandlerSurpport<T>::currentHandler = 0; 

 

class Test : public NewHandlerSurpport<Test> 

public: 

    int val; 

}; 

怎么样?看了上面的代码,大家是否有些迷惑?首先,类NewHandlerSurpport采用的模板类的定义,其内部却没用到类型T;其次,它的子类在继承时,用了class Test : public NewHandlerSurpport<Test>的方式,将自身作为模板类型参数。怪哉怪哉!一般情况下,大家会不采用模板类来定义NewHandlerSurpport,而且子类直接继承即可,为什么要这样大动干戈,而又好像多此一举呢?

 

原来,这么做也是有深意的!因为父类中定义的是静态函数和静态变量,这样按照逻辑,每个继承它的子类都应该独享一份静态数据,也就是独享一份父类,这又怎么实现呢?哈哈,正如上面的模式,让基类是模板类,子类继承是采用子类类型作为模板参数,这样在代码编译时不同的继承类就将父类具现化成各自所属的父类,也就是说各自有一份具现化后的父类的拷贝的代码块,各自具有自己所属的静态成员数据和函数,而不会共用一份,有点绕口了!呵呵!相信聪明的呢已经理解了我的意思!这种奇特的方式叫做“怪异的循环模板模式”,在《effective c++》中叫做“do it for me ”,not do it for others!这个名字更贴切些!

 

 

 

发现《effective c++》的内容真是博大精深啊,这也是我看的时间最长的一本书了!而且每次温习都有收获!

  评论这张
 
阅读(180)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017