首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-09 
用模板编程代替虚函数,编译失败了,如何解决呢?虚函数有调用开销,所以考虑能否用模板的方法代替虚函数,达到

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

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();
}


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

热点排行