Veneers的概念相当简单,一个Veneer其实就是一个类模板,它拥有以下特征:
1)它从自己的主模板参数派生而来(常以public方式)
2)它不定义任何虚方法
3)它不定义任何非静态成员变量,也不定义虚拟析构方法
4)在2)和3)的基础上更进一步,相比于模板参数类,它并不会增加复合类的内存访问频率。
Veneers常常更改了模板参数类的行为或类型。更改行为采用的方法是使用次模板参数提供的额外功能来补充现有功能。
考虑一种情况:向一个非常严密的层次结构中注入新的功能,ATL中的CWindow是一个很好的例子。CWindow没有可以获取对话栏文本长度的成员函数,我们可以使用Win32的API函数GetWindowTextLength()以及CWindow的成员函数GetDlgItem()来创建一个Veneer类parent_window_veneer,其代码如下所示:
template<typename T>
classparent_window_veneer : public T
{
public:
typedef T ParentClass;
typedef parent_window_veneer<T> Class;
//construction
public:
……
//operations
public:
int GetDlgItemTextLength(UINT id)
{
return ::GetWindowTextLength(GetDlgItem(id));
}
};
任何可能用到CWindow类的地方都可以用parent_window_veneer<CWindow>替换,这样一来GetDlgItemTextLength()方法在该类或该类的派生类的实例中就可以使用了。当然不采用模板化继承也可以实现这一功能,但是如果之后你又想将这个函数添加到另外一个ATL窗口类(如CContainedWindow)中,你就不得不再写一个派生类,以此类推。Veneer很容易被各种类型的窗口类使用,只要它们含有兼容的GetDlgItem()成员函数即可,剩下唯一要做的事就是修改一下类型定义(typedef)。
Veneers也可以提供析构方法,不过需要注意的是:如果模板参数不是一个多态可继承的类型(比如它不包含一个虚拟析构方法),就不要将它多态地使用。
最后,因为Veneers与它们的模板参数类型大小相同,因此在需要数组的情况下可以用Veneers替换其模板参数类型。
Veneers的优势包括:
- 在不重复编写代码的前提下向继承层次结构成功注入了新的功能代码
- 它们可被用来向已存在的类中增加资源自动清理的功能,常使用RAII手法。(STLSoft库中的容器Veneers为C++标准库中的容器类提供了这样的功能)
- 大小的限制意味着参数化的Veneer类型可以在数组形式中使用,而不会碰到异构数组的问题
STLSoft库中有一些Veneers类的实际例子,包括pod_veneer,conversion_veneer,sequence_container_veneer以及associative_container_veneer。你可以查看这些类的说明文档以加深对Veneers概念的理解。
来源:http://synesis.com.au/resources/articles/cpp/veneers.pdf
翻译:ume@2011-12-03
关键字:模板化继承、泛型继承、templatedinheritance、generic inheritance、Veneers
分享到:
相关推荐
java 继承泛型类示例 java 继承泛型类示例 java 继承泛型类示例
c#使用 和 继承 泛型类
java 继承非泛型类示例 java 继承非泛型类示例 java 继承非泛型类示例
gson 解析泛型和将泛型转为json字符串
Java 泛型最全指南(定义和使用+继承泛型类/实现泛型接口+泛型的边界+通配符+类型擦除)
C++程序设计与实践:11-模板和泛型编程.ppt
Gson解析json,实现泛型解析数据,根据用户传入的类型,解析称用户需要的,Common \CommonList 里面的status message data相关的约定可以更具开发者与服务器的约定修改
利用泛型解析xml文件 自带xml文件
多层嵌套的JSON字符串也可以解析,泛型T的属性要和JSON字符串反序列化的对象属性一致。
模板和泛型编程ppt,学习用。
winform窗体继承泛型类时,设计器无法使用解决办法: 当我们使用winform程序时,winform窗体程序和控件程序都是可以通过设计器进行控件拖拽的,但如果我们继承了一个带有泛型的form基类.那么设计器是无法使用的.
泛型 反射 概念 方法 使用
3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....
C++标准模板库STL和泛型编程简介,数觉结构和算法的分离
winform窗体继承泛型类时,设计器无法使用解决办法: 当我们使用winform程序时,winform窗体程序和控件程序都是可以通过设计器进行控件拖拽的,但如果我们继承了一个带有泛型的form基类.那么设计器是无法使用的. 这时...
泛型的基本概念 函数模板和类模板的实现 C++标准模板库
泛型与泛型继承知识:大家一起来学习,多多沟通,共同进步
泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名...
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
Java泛型解析(03)虚拟机执行泛型代码.doc