переопределить виртуальный метод с помощью шаблона

Возможный дубликат:
Может ли шаблон функции-члена быть виртуальным?

В базовом классе функция 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*разве это не будет проблемой?

Некоторые предложили здесь проблему с дизайном, я думаю, это правда, тогда мне придется подумать, как обойти это.

7

Решение

Ваш шаблонный метод перегрузки оригинал (то же имя, но разные параметры). Вы все еще должны переопределение оригинал, чтобы сделать ваш производный класс неабстрактным. Вы можете сделать оба без проблем, поэтому у вас будет две версии метода в производном классе, просто будьте осторожны и помните, какой из них будет вызван …

Затем вы можете сделать переопределенную версию метода перегрузки для вызова новой версии шаблона перегрузки. Это может или не может делать то, что вы хотите достичь, в зависимости от того, чего вы хотите достичь …

Во избежание путаницы, возможно, было бы лучше, чтобы метод шаблона имел другое имя, потому что вы не можете вызывать его напрямую, если у вас нет указателя на тип производного класса. Если у вас есть указатель на абстрактный базовый класс, вы должны вызывать метод с определенными там параметрами, даже если это виртуальный метод, а метод производного класса — это то, что фактически вызывается.

5

Другие решения

Проблема в том, что шаблон изменяет сигнатуру функции, поэтому он больше не переопределяет виртуальную функцию в базовом классе, поэтому ваш класс продолжает оставаться абстрактным.

Шаблон виртуальной функции, кажется, побеждает полиморфную природу виртуальной функции в базовом классе.

2

Функция в производном классе должна иметь одинаковую сигнатуру, чтобы правильно переопределить функцию вашего базового класса (и избавиться от ошибки абстрактного типа).
Это означает :

  • то же имя
  • тот же номер параметра и типы
  • одинаковые квалификаторы (например, константность)
  • совместимые типы возвращаемых данных (хотя технически это не является частью сигнатуры iirc)

Таким образом, использование шаблона в таком случае может привести к такого рода ошибкам. Лучше всего опубликовать пример кода, чтобы люди могли лучше понять ваш конкретный случай.

1

Вы не можете сделать это, потому что my_func Версия шаблона не является ковариантной по отношению к базовому классу. Это проблема дизайна у вас здесь, кстати.

1
По вопросам рекламы [email protected]