Разрешены ли чисто виртуальные методы в шаблонном классе?

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

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?

43
задан Anthony 19 January 2012 в 00:33
поделиться