在基类中,函数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){
//
}
但是,对于_Jet
为Jet*
的情况,此函数和模板函数是相同的,这也不是问题吗?
有些人在这里提出了一个设计问题,我想这是真的,我将不得不考虑如何解决这个问题。
答案 0 :(得分:5)
您的模板化方法重载原始(同名但不同的参数)。您仍然必须覆盖原始,以使您的派生类非抽象。你可以做到这两点没有问题,所以你在派生类中会有两个版本的方法,只要小心并意识到哪一个会被调用...
然后,您可以使用overriden重载版本的方法来调用新模板重载版本。根据你想要实现的目标,这可能会或可能不会达到你想要达到的目的......
模板方法可能仍然有更好的名称,以避免混淆,因为无论如何都不能直接调用它,除非你有派生类类型的指针。如果你有指向抽象基类的指针,你必须使用那里定义的参数调用该方法,即使它是虚方法,派生类方法实际上是被调用的。
答案 1 :(得分:2)
问题是模板正在改变函数的签名,因此它不再覆盖基类中的虚函数,因此你的类继续是抽象的。
模拟虚函数似乎打败了基类中虚函数的多态性。
答案 2 :(得分:1)
派生类中的函数需要具有相同的签名才能正确覆盖基类的功能(并消除抽象类型错误)。 这意味着:
的确,在这种情况下使用模板会导致这种错误。最好的方法是发布一个代码示例,以便人们可以更好地了解您的具体案例。
答案 3 :(得分:1)
您无法做到这一点,因为my_func
模板版本与基类不兼容。这是你在这里遇到的设计问题,顺便说一句。