读书人

用模板编程代替虚函数,编译失败了,怎么

发布时间: 2012-03-09 16:54:56 作者: rapoo

用模板编程代替虚函数,编译失败了,如何解决呢?
虚函数有调用开销,所以考虑能否用模板的方法代替虚函数,达到同样的效果:
大家都知道,一般虚函数的用法是这样的:

C/C++ code
struct Base{  virtual void g()=0;  void f(){g();}};struct Child:public Base{  void g(){cout<<"hello world\n"<<endl;}};

然后
Child c;
c.f();
这个没有问题。

但是如果我改成用模板:
C/C++ code
template<class T>struct Base{    void g();    void f(){g();}};template<class T>struct Child: public Base<T>{    void g(){cout<<"hello\n";}};int _tmain(int argc, _TCHAR* argv[]){    Child<int> c;    c.f();    return 0;}

编译不过去了。显然,我的Base里面g是没有被定义的,这是一个明显的错误。

问题是,我想用模板的方式来模拟虚函数做的"绑定"的工作。如果不借助第三方的库如boost等,我应该如何修改我的代码,达到我预期的"需求"呢?

各位c++高手说说哈!

[解决办法]
你是想实现编译时虚函数绑定吧,你的实现方法就错了。

template <typename Host>
class Base{
public:
void f(){
((Host*)this)->g();
}
};


struct Child: public Base<Child>{
void g(){cout<<"hello\n";}
};

main(){
Child c;
c.f();
}


这种方法可以把同样的代码提取到基类作为公用部分,然后每个子类实现各自的匹配接口。

读书人网 >C++

热点推荐