Curiously Recurring Template Pattern(CRTP 手法)是一种利用模板机制实现静态多态的 C++ 惯用法。

其原理很简单:通过模板函数中的强制类型转换,调用子类的同名函数,从而模拟多态的动态绑定,实现与虚函数相同的功能,同时避免了动态绑定带来的性能开销。

template <class T>
                class A
                {
                public:
                	void func(){ ((T*)this)->funcImpl(); };
                	void funcImpl(){}
                };
                
                class B:public A<B>
                {
                public:
                	void funcImpl(){ cout << __FUNCTION__ << endl; }
                };
                
                
                
                int main(int argc, char *argv[])
                {
                
                	A<B> *a = new B;
                	a->func();
                
                	system("pause");
                	return 0;
                }
                

CRTP 虽然能在部分场合模拟虚函数的功能,但无法完全替代虚函数来实现多态。原因在于它基于模板,子类的类型在编译期就已经确定,有点类似于语法糖。