myclassfromtemp;myclassfromtemp m;
int a = mMyfunc();
通常在使用模板类时为了方便起见使用一个关键字typedef为新定义出来的类取一个名字在上面的程序段中假设MyClass是一个由用户定义的类通过将这个类的名字作为类型参数传递给模板类我们可以创建一个新的类这个类的行为将以模板类的定义为基础例如它具有模板类定义的所有成员函数同时这个类又是对模板类行为的一种修改这种修改是通过用户提供的类型参数来实现的赋予模板类以不同的类型参数则得到行为框架相似但具体行为不同的一组类的集合有了新的类的定义以后我们可以象使用普通类一样来创建一个类的实例即一个新的对象并且调用这个对象的成员函数
模板类是对标准C++语言的最新扩展虽然它的功能很强大但是要想使用好模板类需要相当多的关于语言和编程的经验和知识而且错误地使用模板类又会对程序的结构和运行效率带来大的副作用因此一般的编程环境和编程书籍对模板类的使用都采取谨慎的态度而ATL的核心就是由几十个模板类构成的通过研究ATL的源代码可以使我们对模板类的使用有比较深刻全面的认识
多继承技术同模板一样是C++语言中极具争议性的技术使用多继承技术可以使程序的设计和实现更加灵活但是由于多继承的复杂性和自身概念上的一些问题使多继承在各种面向对象的语言环境中得到的支持都非常有限例如Small Talk根本就不允许多继承同样MFC也不支持多继承技术
多继承最大的问题是所谓的钻石结构例如下面的代码
class A
{
};
class B : public A
{
};
class C : public A
{
};
class D : public CB
{
}
由于类D同时从类C和B继承因此在下面的语句中就会发生歧义
D* pD = new D;
(A*)pD>Func();
由于类D通过类C和类B 分别继承了类A这里的强制转化就会发生歧义
ATL使用了C++最新规范中加入的两个运算符号 static_castdynamic_cast代替简单的强制转化从而消除多继承带来的歧义使用这两个运算符号我们可以在对象运行过程中获取对象的类型信息上面的代码可以采用下面的方式修改
D* pD = new D;
static_cast(static_cast(pD))>Func();
为什么模板类和多继承技术会成为ATL主要的工具呢?原因在于采用模板可以在编译过程中快速的生成具有用户定制功能的类这对于COM这样一个复杂的技术体系在实现效率上得到了很大的提高通过使用模板类用户可以把精力集中在自己开发的类的基本逻辑上在完成了自己的类的设计以后通过继承不同的类生成不同的模板类就可以快速地实现COM的功能同时又避免了采用单继承结构造成的大量功能冗余
总之正是由于在设计实现过程中采用了模板类和多继承技术才使ATL成为一个小巧灵活的COM开发工具能够适应开发人员对COM应用开发的各种需要