模板类中是否允许纯虚拟方法?
有一次,我确信你不能这样做,但是前几天我正在玩一些代码,似乎是编译和工作的。 我只是想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; };