Обработайте по шаблону дочерний класс, переопределяющий виртуальную функцию родительского класса

Ниже компиляций кода с 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;
}

Это затем выводы:

Основывайте интервал 3
Основа удваивается 5.5
Дочерний TT 3
Основа удваивается 5.5
Дочерний TT 3
Основа удваивается 5.5

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

5
задан user334066 6 May 2010 в 03:56
поделиться

2 ответа

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

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

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

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

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

, он не переопределил бы BaseClass :: Func .

8
ответ дан 13 December 2019 в 22:03
поделиться

Это не нарушает правило. Фактическое правило гласит 14.5.2/4:

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

template  struct AA {
 template  virtual void g(C); // error
 virtual void f(); // OK
};
2
ответ дан 13 December 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: