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),预定义一些可选的方法。