Contents
我上一篇博客C++的静态分发(CRTP)和动态分发(虚函数多态)的比较介绍了如何用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
|