9

可能重复:
成员函数模板可以是虚拟的吗?

在基类中,函数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){
//
}

但是,这个函数和模板函数在 be 的情况下是一样的_JetJet*那不也是个问题吗?

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

4

4 回答 4

5

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

然后,您可以制作方法的覆盖重载版本来调用新的模板重载版本。这可能会或可能不会做您想要实现的目标,具体取决于您想要实现的目标......

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

于 2012-12-11T10:47:00.840 回答
2

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

模板化虚函数似乎破坏了基类中虚函数的多态性。

于 2012-12-11T10:42:31.170 回答
1

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

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

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

于 2012-12-11T10:41:45.687 回答
1

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

于 2012-12-11T10:45:14.763 回答