ele*_*ias 8 c++ inheritance templates virtual-functions
可能重复:
成员函数模板可以是虚拟的吗?
在基类中,该函数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;
Run Code Online (Sandbox Code Playgroud)
但是在派生类中我想要:
template<typename _Jet>
void Fill(EventInfo* info, EasyChain* tree, vector<Muon*>& muons_in, vector<Electron*>& electrons_in, vector<_Jet>& jets_in, LorentzM& met){
Run Code Online (Sandbox Code Playgroud)
根据您的回答,我理解问题的解决方案是在派生类中定义另一个函数:
void Fill(EventInfo* info, EasyChain* tree, vector<Muon*>& muons, vector<Electron*>& electrons, vector<Jet*>& jets, LorentzM& met){
//
}
Run Code Online (Sandbox Code Playgroud)
但是,这个函数和模板函数对于存在的情况_Jet是一样的Jet*,这不是一个问题吗?
有些人在这里提出了设计问题,我想这是真的,我将不得不考虑如何解决这个问题.
您的模板化方法会重载原始方法(相同名称但不同的参数).您仍然必须覆盖原始,以使您的派生类非抽象.你可以做到这两点都没有问题,所以你在派生类中会有两个版本的方法,只要小心并意识到哪一个会被调用...
然后,您可以使用overriden重载版本的方法来调用新模板重载版本.这可能会也可能不会达到您想要达到的目标,具体取决于您想要实现的目标......
为了避免混淆,模板方法可能仍然更好,以避免混淆,因为除非你有派生类类型的指针,否则无论如何都不能直接调用它.如果您有指向抽象基类的指针,则必须使用其中定义的参数调用该方法,即使它是虚方法并且实际调用派生类方法.