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

有一次,我确信你不能这样做,但是前几天我正在玩一些代码,似乎是编译和工作的。 我只是想validation我不只是幸运。 一个模板类可以有一个纯虚函数 – 我猜这也意味着只是简单的虚方法对于析构函数也是有效的?

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; } 

我已经尝试过在网上查找它,所有我已经能够find的是,你不能有一个正常的类,如这样的虚拟方法(纯的或其他):

 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; } 

而这是由于pipe理一个虚拟表的可能性,以引用所有不同types的可能types,这个方法将被实例化。

但是,当它涉及模板类的虚拟成员函数时,它似乎是不同的,因为当模板类variables被实例化时,整个类本身是通过模板参数“创build”的。 在这一点上,由于模板的“查找和replace”性质,虚拟方法就像任何其他types的虚拟方法一样。

无论如何,再次提出这个问题,以防万一它在那里迷路了:在一个临时类中是否允许虚拟(纯的和/或正常的)虚拟函数?

类模板确实可以包含虚拟或纯虚函数。 Andrei Alexandresu在“现代C ++devise”中采用了这种方法来实现使用模板和types列表的访问者模式。 如果你有兴趣,你可以在他的Loki图书馆看到这个代码。

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

正如你所提到的,你不能有一个虚拟模板成员函数,因为vtable插槽的数量在翻译单元中是不可知的。

希望这可以帮助!

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

是。 完全合法。

考虑模板类是什么 – 它本身不是类,而是编译器可以用来创build类的模板。

因此,没有理由不能在模板类定义中包含一个虚拟函数(纯的或其他的),因为这本身不会产生任何代码,包括虚拟表。

当我们真正实例化模板类,例如DataSource<int> ,编译器只需要为这个select的types创build虚拟表,所以它与没有模板类的(纯的或其他) 。

具有虚拟function的类模板绝对没问题。 但是,不允许使用在类或模板类中前缀的虚拟关键字的模板函数。 下面会帮助你得到:

 //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; };