程序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的其它秘密。
|