用模板编程代替虚函数,编译失败了,怎么解决呢
用模板编程代替虚函数,编译失败了,如何解决呢?虚函数有调用开销,所以考虑能否用模板的方法代替虚函数,达到
用模板编程代替虚函数,编译失败了,如何解决呢?
虚函数有调用开销,所以考虑能否用模板的方法代替虚函数,达到同样的效果:
大家都知道,一般虚函数的用法是这样的:
C/C++ codestruct 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++ codetemplate<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();
}
这种方法可以把同样的代码提取到基类作为公用部分,然后每个子类实现各自的匹配接口。