override virtual method with template method
Possible Duplicate:
Can a member function template be virtual?
基类中的函数定义,
看来它是不是,我得到错误"无法分配一个类型的对象的抽象",我相信这是相关的事实,不承认该编译器的虚拟
谢谢了很多。
更新:谢谢你的回答。一些提示你应该加一后的代码的操作系统,它是在这里。类的基础:
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){ // } |
然后,该函数的功能是相同的模板的情况下也不会被
这里有一些建议的设计的问题,我想这是真的,我不得不想起,然后绕这一技术。
模板化的方法重载原始的(相同的名称,但不同的参数)。为了使派生类非抽象,还必须重写原始类。这两种方法都可以,所以在派生类中有两个版本的方法,只要小心并意识到哪一个方法会被调用…
然后可以使方法的overriden重载版本调用新的模板重载版本。这可能会或可能不会实现你想要实现的目标,这取决于你想要实现的目标…
模板方法最好使用不同的名称,以避免混淆,因为除非有派生类类型的指针,否则无论如何都不能直接调用它。如果有指向抽象基类的指针,则必须使用在其中定义的参数调用该方法,即使它是虚拟方法,并且派生类方法是实际调用的方法。
问题是模板正在更改函数的签名,因此它不再重写基类中的虚拟函数,因此类继续是抽象的。
对虚拟函数进行模板化似乎会破坏基类中虚拟函数的多态性。
不能这样做,因为
派生类中的函数需要具有相同的签名,以便正确地重写基类的函数(并消除抽象类型错误)。这意味着:
- 同名
- 相同的参数编号和类型
- 相同的限定符(例如常量)
- 兼容的返回类型(即使从技术上讲这不是签名IIRC的一部分)
因此,在这种情况下使用模板确实会导致这种错误。最好是发布一个代码示例,这样人们就可以更好地了解您的具体案例。