使用模板方法覆盖虚方法

时间:2012-12-11 10:37:03

标签: c++ templates inheritance virtual-method

  

可能重复:
  Can a member function template be virtual?

在基类中,函数my_func被定义为虚拟。但是,在派生类中,我希望my_func成为模板方法。这可能吗?

似乎不是。我得到错误“无法分配抽象类型的对象”,我认为这与编译器不承认基类中的虚拟my_func的覆盖这一事实有关。这是否会显示出糟糕的设计?

非常感谢。

更新: 谢谢你的回答。你们有些人建议我发布一些代码,所以在这里。 在基类中:

virtual void Fill(EventInfo* info, EasyChain* tree, vector<Muon*>& muons, vector<Electron*>& electrons, vector<Jet*>& jets, LorentzM& met) = 0;

但是在派生类中我想:

template<typename _Jet> 
void Fill(EventInfo* info, EasyChain* tree, vector<Muon*>& muons_in, vector<Electron*>& electrons_in, vector<_Jet>& jets_in, LorentzM& met){

从您的回答中,我了解问题的解决方案是在派生类中定义另一个函数:

void Fill(EventInfo* info, EasyChain* tree, vector<Muon*>& muons, vector<Electron*>& electrons, vector<Jet*>& jets, LorentzM& met){
//
}

但是,对于_JetJet*的情况,此函数和模板函数是相同的,这也不是问题吗?

有些人在这里提出了一个设计问题,我想这是真的,我将不得不考虑如何解决这个问题。

4 个答案:

答案 0 :(得分:5)

您的模板化方法重载原始(同名但不同的参数)。您仍然必须覆盖原始,以使您的派生类非抽象。你可以做到这两点没有问题,所以你在派生类中会有两个版本的方法,只要小心并意识到哪一个会被调用...

然后,您可以使用overriden重载版本的方法来调用新模板重载版本。根据你想要实现的目标,这可能会或可能不会达到你想要达到的目的......

模板方法可能仍然有更好的名称,以避免混淆,因为无论如何都不能直接调用它,除非你有派生类类型的指针。如果你有指向抽象基类的指针,你必须使用那里定义的参数调用该方法,即使它是虚方法,派生类方法实际上是被调用的。

答案 1 :(得分:2)

问题是模板正在改变函数的签名,因此它不再覆盖基类中的虚函数,因此你的类继续是抽象的。

模拟虚函数似乎打败了基类中虚函数的多态性。

答案 2 :(得分:1)

派生类中的函数需要具有相同的签名才能正确覆盖基类的功能(并消除抽象类型错误)。 这意味着:

  • 同名
  • 相同的参数编号和类型
  • 相同的限定符(例如constness)
  • 兼容的退货类型(即使它在技术上不属于签名版iirc)

的确,在这种情况下使用模板会导致这种错误。最好的方法是发布一个代码示例,以便人们可以更好地了解您的具体案例。

答案 3 :(得分:1)

您无法做到这一点,因为my_func模板版本与基类不兼容。这是你在这里遇到的设计问题,顺便说一句。