在ATL的类库中,存在大量的C++模板,特化,偏特化,还是一种模板---基类模板(姑且这么叫吧),可能是平时不多见,在ATL中却是漫山遍野,几乎每一个类都采用了这种实现方式.
先看代码:
Code
class CBase{
public:
virtual void Methord(){
std::cout<<"CBase"<<std::endl;
}
};
template<typename T>
class Drived:public T{
public:
void CallMethord(){
T *aT = static_cast<T*>(this);
aT->Methord();
}
void Methord(){
std::cout<<"Drived"<<std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Drived<CBase> d;
d.CallMethord();
return 0;
}
从运行结果上可以看出.它不仅可以调用基类函数,而且实现了函数重写(override).完成了继承与虚函数可以实现的功能.
还有一个明显的优点,那就是省去虚表结构.小的类也许虚表结构不大,但是大的类或者由于多次继承产生的虚表膨胀就会占去很大的空间.而且虚表采用晚绑定方式,在性能上就会有一定下降.而采用这种方式,在空间与时间都有很多提高。(我想是这样,不过没测试过)