模板类中是否允许使用纯虚方法?

Ant*_*ony 43 c++ virtual templates

以前,我确信你不能这样做,但前几天我正在玩一些代码,它似乎编译和工作.我只是想证实我不仅仅是幸运.模板类可以有一个纯虚函数 - 我想这也意味着普通的虚方法对于析构函数也是有效的吗?

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;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试在网上查找它了,我能找到的就是你不能在正常的类中使用虚拟方法(纯或其他),例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

而这是由于管理虚拟表以引用此方法将实现的所有不同类型的可能类型的不可能性.

但是,当涉及模板类的虚拟成员函数时,它似乎是不同的,因为当模板类变量被实例化时,整个类本身通过模板参数"创建".此时,由于模板的"查找和替换"性质,虚拟方法就像任何其他类的方法一样.

无论如何,如果它丢失在那里再次说明问题:在tempate类中是否允许虚拟(纯和/或正常)虚拟函数?

tem*_*def 52

类模板确实可以包含虚拟或纯虚函数.这是Andrei Alexandresu在"Modern C++ Design"中使用的,它使用模板和类型列表来实现访问者模式.如果您有兴趣,可以在他的Loki图书馆看到这里的代码.

对于大多数标准C++实现,这很好,因为当实例化模板时,虚函数最终成为单个函数.因此,可以在翻译单元内知道vtable中所需的插槽数量,因此可以生成vtable.

如您所述,您不能拥有虚拟模板成员函数,因为在翻译单元中无法知道vtable插槽的数量.

希望这可以帮助!


jpa*_*cek 8

在tempate类中是否允许虚拟(纯和/或普通)虚函数?

是.完全合法.


Joh*_*McG 7

想想模板类是什么 - 它本身不是类,而是编译器可以用来创建类的模板.

因此,没有任何理由可以不包括虚函数模板类定义(纯或其他方式),因为,在其本身并不会产生任何代码,包括虚表.

当我们真正实例化模板类,例如DataSource<int>,则编译器只需要建立一个所选类型的虚拟表,所以它不是比一个非模板类(纯或其他方式)的虚函数有什么不同.


小智 5

带有虚函数的类模板绝对没问题。但是,不允许在类或模板类中使用以 virtual 关键字为前缀的模板函数。以下将帮助您了解:

//This is perfectly fine.
template <type T>
class myClass{
     virtual void function() = 0;
};

//This is NOT OK...
template<type T>
class myClass{
      template <type T>
      virtual void function() = 0;
};
Run Code Online (Sandbox Code Playgroud)