用template模拟虚函数多态性

  以前写过关于对象的多态技术的讨论,提到传统的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++的人都必须是严肃认真的铁人,有足够能力在事前规划一切,如果不适应这种风格,大量细节会让你疯狂……”

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.