我上一篇博客[C++的静态分发(CRTP)和动态分发(虚函数多态)的比较](http://www.cnblogs.com/fresky/p/3504241.html)介绍了如何用CRTP(Curiously Recurring Template Pattern)实现静态分发,今天再讲另外一个CRTP的例子。在C++中静态函数是不能设成virtual的,但是用CRTP可以实现静态函数的多态。
先看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
template<typename Derived> class Parent { public: void SayHi() { static_cast<Derived*>(this)->SayHiImpl(); } void static SayHiStatic() { Derived::SayHiStatic(); } private: void SayHiImpl() { cout << "hi, i'm default!" << endl; } }; class ChildA :public Parent<ChildA> { public: void SayHiImpl() { cout << "hi, i'm child A!" << endl; } void static SayHiStatic() { cout << "Static hi from Child A" << endl; } }; class ChildB :public Parent<ChildB> { public: void static SayHiStatic() { cout << "Static hi from Child B" << endl; } }; |
和上次的代码类似,这次父类有一个静态的interface,两个子类分别实现了自己的静态实现。
再看调用静态 interface 的函数和 main 函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
template<typename Derived> void CRTP(Parent<Derived>& p) { p.SayHiStatic(); } int _tmain(int argc, TCHAR* argv[]) { ChildA a; CRTP(a); cout << "size of ChildA: " << sizeof(a) << endl; ChildB b; CRTP(b); cout << "size of ChildB: " << sizeof(b) << endl; return 0; } |
运行可以得到如下输出:
1 2 3 4 |
Static hi from Child A size of ChildA: 1 Static hi from Child B size of ChildB: 1 |