设为首页 加入收藏

TOP

ATL布幔下的秘密之模板技术(三)
2012-11-04 15:06:57 来源: 作者: 【 】 浏览:1039
Tags:ATL 秘密 模板 技术
  程序53.

#include <iostream>
using namespace std;

template <typename T>
class Base {
public:
void fun() {
cout << "Base::fun" << endl;
}

void doSomething() {
T* pT = static_cast<T*>(this);
pT->fun();
}
};

class Drive : public Base<Drive> {
public:
void fun() {
cout << "Drive::fun" << endl;
}
};

int main() {
Base<Drive>* pBase = NULL;
pBase = new Drive;
pBase->doSomething();

return 0;
}
  
  现在程序正常工作,并给出了我们所期望的输出,也就是:Drive::fun

  但是在Base类有多个继承的时候,就会出现问题。为了更好地弄懂这一点,请看下面的程序。

  程序54.

#include <iostream>
using namespace std;

template <typename T>
class Base {
public:
void fun() {
cout << "Base::fun" << endl;
}

void doSomething() {
T* pT = static_cast<T*>(this);
pT->fun();
}
};

class Drive1 : public Base<Drive1> {
public:
void fun() {
cout << "Drive1::fun" << endl;
}
};

class Drive2 : public Base<Drive2> {
public:
void fun() {
cout << "Drive2::fun" << endl;
}
};

int main() {
Base<Drive1>* pBase = NULL;
pBase = new Drive1;
pBase->doSomething();
delete pBase;

pBase = new Drive2;
pBase->doSomething();

return 0;
}

  程序会在下面的代码处给出错误:pBase = new Drive2;

  因为pBase是一个指向Base<Drive1>的指针,而不是Base<Drive2>。简单地说来,就是你不能使Base类的指针指向不同的Drive类。换句话说,你不能使用Base类指针的数组存储不同的派生类,而在虚函数之中则是可行的。

   希望在下一篇文章中能够探究一些ATL的其它秘密。
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Windows 中不规则窗体的编程实现 下一篇ATL布幔下的秘密之虚函数背后的东..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: