Раньше я был уверен, что вы не могли этого сделать, но на днях я играл с некоторым кодом, и он, казалось, собирал и работал. Я просто хочу проверить, что мне не просто повезло. Может ли класс шаблона иметь чистую виртуальную функцию, что, я думаю, также означало бы, что для деструктора допустимы и просто виртуальные методы?
template <typename WordType> class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();
virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}
Я попытался найти его в Интернете, и все, что я смог найти, это то, что вы не можете иметь виртуальный метод (чистый или иной) в обычном классе, например:
class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();
template <typename WordType>
virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}
И это связано с невозможностью управления виртуальной таблицей для ссылки на все типы типов возможных типов, с которыми этот метод мог бы быть создан.
Однако, когда дело доходит до виртуальной функции-члена класса шаблона, это кажется другим, потому что весь класс сам "создается" через параметр шаблона, когда изменена переменная класса шаблона. На данный момент виртуальный метод аналогичен любому другому виртуальному методу класса из-за "поиска и замены" шаблонов.
В любом случае, снова задавая вопрос, если он там затерялся: Виртуальные (чистые и/или нормальные) виртуальные функции разрешены в классе tempate?