以前写过关于对象的多态技术的讨论,提到传统的C++虚函数的做法,像对话框这样的接口,会产生一个巨大的虚函数表,调用时,实际都要执行两步:先通过虚函数表找到函数指针,然后再运行函数。
那么C++有什么其他解决方法呢?可以借助模板技术。
首先,Framework实现一个template作为接口:
| template<class T> class FrameworkBase1 { public: //调用接口 void HelloWorld(void) { static_cast<T *>(this)->SayHello(); }; //实际实现,这里提供一个默认版本,也可以不提供,类似纯虚基类 void SayHello(void) { cout<<“Hello World! This is FrameworkBase1n”; }; protected: //下面都是扮演Framework调用HelloWorld接口 void call1(void) { HelloWorld(); } void call2(void) { HelloWorld(); } }; | 
当用户打算实现这个接口,提供给Framework回调的时候,就这样:
| class Derived1 : public FrameworkBase1<Derived1> { public: //重新实现 void SayHello(void) { cout<<“Hello World! This is Derived1n”; }; }; | 
当然,也可以采用Base1类的默认动作:
| class Derived2 : public FrameworkBase1<Derived2> { //啥也不做,直接采用FrameworkBase1默认的实现 }; | 
Alan Kay评价:“……所有喜欢和擅长C++的人都必须是严肃认真的铁人,有足够能力在事前规划一切,如果不适应这种风格,大量细节会让你疯狂……”