WEB开发网
开发学院软件开发VC ATL布幔之下的秘密(3) 阅读

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;
}

程序的输出为:

上一页  4 5 6 7 8 9 10  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接