CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(四)


 
1.7 Policy Classes的析构函数

我们已知host class从policy class公有继承。那么将一个指向host class对象的policy class指针delete,将会产生不可预期的结果。解决方法有三:

1、将policy的析构函数声明为虚函数。但这样会妨碍policy的静态连接特性,也会影响执行效率。第一个虚函数的加入会使对象大小带来额外开销。

2、采用protected继承或private继承(派生类指针将不能转化为基类指针,cuigang)。但policy的函数则不能对外访问,失去用户扩充的特性(见1.6节)。

3、定义一个非虚的protected析构函数。(不能对基类指针delete,因为析构函数不可访问,cuigang)

方法3显然没有1、2的副作用。

1.8 通过不完全具现化而获得的选择性机能

更进一步。由于对于模板类中的成员函数,如果未曾用到,那么它就不会被编译器具现出来,有的编译器甚至不对其进行语法检查。如此便导致host class有机会指明并使用policy class的可选特性。如:

 1 template < template <class> class CreationPolicy >
 2 class WidgetManager : public CreationPolicy<Widget>
 3 {
 4       //
 5       void SwitchPrototype(Widget* pNewPrototype)
 6       {
 7            CreationPolicy<Widget>& myPolicy = *this;
 8            delete myPolicy.GetPrototype();
 9            myPolicy.SetPrototype(pNewPrototype);
10       }
11 }


那么

1、如果你采用的CreationPolicy支持GetPrototype(),那么使用WidgetManager::SwitchPrototype()没问题。

2、如果你采用的CreationPolicy不支持GetPrototype(),那么使用WidgetManager::SwitchPrototype()编译出错。

3、如果你采用的CreationPolicy不支持GetPrototype(),但是没有使用WidgetManager::SwitchPrototype(),那么没问题!!!

那么host class的作者就可以利用这种不完整具现化(incomplement instantiation),预定义一些可选的方法。
 

posted on 2007-12-17 21:45 cuigang 阅读(330) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理