0

Подскажите, пожалуйста, корректно ли в C++ делать шаблон класса, который имеет виртуальные методы? Особенно, чисто виртуальные:

template <typename T, size_t C>
class Template
{
    public:
    virtual void method() = 0;
};

class Impl : public Template<int, 10>
{
    // ...    
};

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

Скажите, что говорит Стандарт по этому поводу?

MGNeo
  • 4,128
  • Ничего не понял. "возможно ли ..." Так ведь код компилируется, нет? Значит возможно. – HolyBlackCat Oct 19 '19 at 21:20
  • Код ведь рабочий, просто создаете вутри класса Impl функцию с такой же сигнатурой и пишите override. – Lex Marchenko Oct 19 '19 at 21:22
  • "имеют подозрительную семантику" Можно про это поподробнее? – HolyBlackCat Oct 19 '19 at 21:22
  • @HolyBlackCat, что будет, если в разных единицах трансляции наследоваться от одного и того же шаблона с одними и теми же параметрами инстанцирования, если в шаблоне реализованы виртуальные методы? Ведь в каждой единице трансляции произойдет инстанцирование одного и того же кода (виртуальных методов). Как компилятор/линкер это разруливает? – MGNeo Oct 19 '19 at 21:34
  • 2
    По идее, тот же ворпос можно задать про самые обычные шаблоны, без вирутальных функций. ЕМНИП, действительно инстанцируются в каждой единице трансляции, а линкер потом выбрасывает все копии кроме одной. – HolyBlackCat Oct 19 '19 at 22:11
  • В С++ уже есть синтаксис для указания компилятору того, что шаблон должен быть инстанцирован в определённой точке: template class (специализация шаблона). А можно сказать не инстанцировать шаблон в данной единице трансляции: extern template class (специализация шаблона) – AR Hovsepyan Oct 20 '19 at 05:03
  • 1
    @MGNeo: Как компилятор/линкер это разруливает я подробно объяснял здесь: https://ru.stackoverflow.com/a/991757/182825. Ситуация с множественных инстанцированием шаблонов абсолютно ничем не отличается от множественных определений inline-функций и "разруливается" через те же самые механизмы. – AnT stands with Russia Oct 20 '19 at 06:49
  • Большое всем спасибо за помощь. – MGNeo Oct 20 '19 at 09:30

2 Answers2

1

Разумеется. С т. наз. статическим полиморфизмом это довольно перпендикулярно.

Помнится, в STL классы для IO являются шаблонами, при этом вполне себе полиморфными.

bipll
  • 1,963
1

Шаблонные методы не могут быть виртуальными. Однако "обычные" методы в шаблонных классах могут быть виртуальными без каких-либо ограничений. То есть никаких особенностей тут нет вообще и почему у вас возник такой вопрос - не ясно.