关于C++:用模板方法覆盖虚拟方法

override virtual method with template method

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Can a member function template be virtual?

基类中的函数定义,my_func是虚拟的。然而,在I类衍生my_func是想有一个模板的方法。这是可能的吗?

看来它是不是,我得到错误"无法分配一个类型的对象的抽象",我相信这是相关的事实,不承认该编译器的虚拟my_func在重写的基类。也许这揭示了不差的设计吗?

谢谢了很多。

更新:谢谢你的回答。一些提示你应该加一后的代码的操作系统,它是在这里。类的基础:

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

但在衍生类:我想有一个

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

从你的回答中,我了解到,这一问题是另一个类的定义中的功能性。

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

然后,该函数的功能是相同的模板的情况下也不会被Jet*_Jet,以及这是问题吗?

这里有一些建议的设计的问题,我想这是真的,我不得不想起,然后绕这一技术。


模板化的方法重载原始的(相同的名称,但不同的参数)。为了使派生类非抽象,还必须重写原始类。这两种方法都可以,所以在派生类中有两个版本的方法,只要小心并意识到哪一个方法会被调用…

然后可以使方法的overriden重载版本调用新的模板重载版本。这可能会或可能不会实现你想要实现的目标,这取决于你想要实现的目标…

模板方法最好使用不同的名称,以避免混淆,因为除非有派生类类型的指针,否则无论如何都不能直接调用它。如果有指向抽象基类的指针,则必须使用在其中定义的参数调用该方法,即使它是虚拟方法,并且派生类方法是实际调用的方法。


问题是模板正在更改函数的签名,因此它不再重写基类中的虚拟函数,因此类继续是抽象的。

对虚拟函数进行模板化似乎会破坏基类中虚拟函数的多态性。


不能这样做,因为my_func模板版本与基类1不协变。这是你在这里的设计问题,顺便说一句。


派生类中的函数需要具有相同的签名,以便正确地重写基类的函数(并消除抽象类型错误)。这意味着:

  • 同名
  • 相同的参数编号和类型
  • 相同的限定符(例如常量)
  • 兼容的返回类型(即使从技术上讲这不是签名IIRC的一部分)

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