Шаблонный дочерний класс переопределяет виртуальную функцию родительского класса - PullRequest
5 голосов
/ 06 мая 2010

Приведенный ниже код компилируется с gcc v4.3.3, и шаблонный дочерний класс, кажется, переопределяет виртуальную функцию в родительском, но не нарушает ли это правило, что у вас не может быть функции виртуального шаблона? Или что-то еще происходит, чего я не понимаю?

class BaseClass
{
public:
  virtual void Func(int var)
  {
    std::cout<<"Base int "<<var<<std::endl;
  }

  virtual void Func(double var)
  {
    std::cout<<"Base double "<<var<<std::endl;
  }
};

template <class TT>
class TemplateClass : public BaseClass
{
public:
  using BaseClass::Func;
  virtual void Func(TT var)
  {
    std::cout<<"Child TT "<<var<<std::endl;
  }
};

int main(int argc, char **argv)
{
  BaseClass a;
  TemplateClass<int> b;
  BaseClass *c = new TemplateClass<int>;

  int intVar = 3;
  double doubleVar = 5.5;

  a.Func(intVar);
  a.Func(doubleVar);
  b.Func(intVar);
  b.Func(doubleVar);
  c->Func(intVar);
  c->Func(doubleVar);
  delete c;
}

Затем выводится:

Base int 3
База двойная 5,5
Детский ТТ 3
База двойная 5,5
Детский ТТ 3
База двойная 5,5

как я и надеялся, но я не уверен, почему это работает.

Ответы [ 2 ]

8 голосов
/ 06 мая 2010

Шаблон класса может иметь функции виртуального члена.

Шаблон функции-члена не может быть виртуальным. То есть следующее недопустимо:

class C
{
public:
    template <typename T>
    virtual void f();
};

Кроме того, если производный класс имеет шаблон функции-члена с тем же именем, что и у виртуальной функции в базовом классе, он не отменяет виртуальную функцию. Итак, если TemplateClass::Func был шаблоном функции-члена, например,

template <typename T>
void Func(T var) { /* ... */ }

не будет переопределено BaseClass::Func.

2 голосов
/ 06 мая 2010

Это не нарушает правила. Действительное правило: 14.5.2 / 4:

Шаблон функции-члена не должен быть виртуальным. [Пример:

template <class T> struct AA {
  template <class C> virtual void g(C); // error
  virtual void f(); // OK
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...