用模板方法重写虚拟方法



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

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

但是,对于_JetJet*的情况,这个函数和模板函数是一样的,这不是也是一个问题吗?

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

您的模板化方法重载原始方法(名称相同但参数不同)。您仍然需要覆盖原始类,使派生类成为非抽象类。这两种方法都可以,没有问题,所以派生类中有两个版本的方法,只需小心并注意哪一个会被调用。。。

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

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

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

对虚拟函数进行模板化似乎可以克服基类中虚拟函数的多态性。

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

  • 同名
  • 相同的参数数量和类型
  • 相同的限定符(例如constness)
  • 兼容的返回类型(尽管从技术上讲这不是签名iirc的一部分)

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

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

相关内容

最新更新