ATL布幔之下的秘密(3)
2006-07-22 22:54:58 来源:WEB开发网核心提示: ATL中有两个智能指针,CComPtr和CComQIPtr,ATL布幔之下的秘密(3)(9),你可以用模板做一些有趣的事情,例如你的类可以在不同的情况下成为不同基类的子类,我们也可以模拟虚函数,现在让我们重新回忆一下虚函数,程序48.#include <iostream>usi
ATL中有两个智能指针,CComPtr和CComQIPtr。
你可以用模板做一些有趣的事情,例如你的类可以在不同的情况下成为不同基类的子类。
程序48.
#include <iostream>
using namespace std;
class Base1 {
public:
Base1() {
cout << "Base1::Base1" << endl;
}
};
class Base2 {
public:
Base2() {
cout << "Base2::Base2" << endl;
}
};
template <typename T>
class Drive : public T {
public:
Drive() {
cout << "Drive::Drive" << endl;
}
};
int main() {
Drive<Base1> obj1;
Drive<Base2> obj2;
return 0;
}
程序的输出为:
Base1::Base1
Drive::Drive
Base2::Base2
Drive::Drive
在这里,Drive类是继承自Base1还是Base2是由在对象创建的时候传递给模板的参数决定的。
ATL也使用了这一技术。当你使用ATL创建COM组件的时候,CComObject就会继承自你的类。在这里ATL利用了模板,因为它不会预先知道你用来作COM组件而创建的类的名称。CComObject类定义于ATLCOM.H文件之中。
在模板的帮助下,我们也可以模拟虚函数。现在让我们重新回忆一下虚函数,下面是一个简单的例子。
程序49.
#include <iostream>
using namespace std;
class Base {
public:
virtual void fun() {
cout << "Base::fun" << endl;
}
void doSomething() {
fun();
}
};
class Drive : public Base {
public:
void fun() {
cout << "Drive::fun" << endl;
}
};
int main() {
Drive obj;
obj.doSomething();
return 0;
}
程序的输出为:
更多精彩
赞助商链接