Перегрузка функции виртуального шаблона - PullRequest
0 голосов
/ 03 февраля 2012
template <class T, class U, class Child>
class Parent {
public:
  virtual T blah() {
     return gaga;
  }
protected:
  T gaga;
};

class Child : public Parent<double, double, Child> {
  virtual void blah(int overloaded) {
  }

  virtual void func() {
    blah();
  }
};

int main() {
  Child* p = new Child();
}

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

Ошибки, которые я получаю:

prog.cpp: In member function ‘virtual void Child::func()’:
prog.cpp:16: error: no matching function for call to ‘Child::blah()’
prog.cpp:12: note: candidates are: virtual void Child::blah(int)
prog.cpp: In function ‘int main()’:
prog.cpp:21: warning: unused variable ‘p’

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Метод void blah(int) в Child скрывает унаследованное T blah() в Parent.Вы можете показать его, добавив строку

using Parent::blah; 

к Child.Если вы хотите получить доступ к Parent::blah(), вы должны убедиться, что оператор using находится в разделе открытого доступа.Поэтому вам придется добавить

public:
  using Parent::blah;
private:
  ...

к вершине Child, чтобы сделать Parent::blah() видимым для всех.Вы также можете явно ссылаться на метод базового класса с помощью Parent::blah() вместо blah().Более подробная информация доступна здесь .

0 голосов
/ 03 февраля 2012

У вас просто другой прототип для blah у ребенка.Для parent это T blah(), а для child это void blah(int), тогда как для правильной перегрузки виртуальной функции должно быть double blah().

Кроме того, для чего у вас есть аргумент шаблона Child в parent?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...