C ++类成员函数模板可以是虚拟的吗?

我听说C ++类成员函数模板不能是虚拟的。 这是真的?

如果它们可以是虚拟的,那么可以使用这种功能的场景的例子是什么?


模板都是关于编译器在编译时生成代码的。 虚拟功能都是关于运行时系统确定在运行时调用哪个函数的。

一旦运行时系统计算出它需要调用一个模板化的虚拟函数,编译完成并且编译器不能再生成适当的实例。 因此您不能拥有虚拟成员函数模板。

但是,有几个强大而有趣的技术来源于多态和模板的结合,特别是所谓的类型擦除。


来自C ++模板完整指南:

成员函数模板不能声明为虚拟。 由于虚拟函数调用机制的通常实现使用每个虚拟函数具有一个条目的固定大小的表,因此施加了这个限制。 但是,成员函数模板的实例化数量在整个程序翻译完成之前并不固定。 因此,支持虚拟成员函数模板需要支持C ++编译器和链接器中的全新机制。 相比之下,类模板的普通成员可以是虚拟的,因为它们的数量在实例化类时是固定的


C ++现在不允许虚拟模板成员函数。 最可能的原因是实施它的复杂性。 拉金德拉给出了很好的理由,为什么现在不能做到这一点,但可以通过标准的合理变化来实现。 特别是计算一个模板函数实际存在多少个实例,并且如果考虑到虚函数调用的地方,那么构建虚表变得很困难。 标准人员现在还有很多其他事情要做,而C ++ 1x对于编译器编写者来说也是很多工作。

你什么时候需要模板化的成员函数? 我曾经遇到过这样一种情况,我尝试用纯虚拟基类来重构层次结构。 实施不同策略的风格很差。 我想将其中一个虚拟函数的参数更改为数字类型,而不是重载成员函数并覆盖所有子类中的每个重载,我尝试使用虚拟模板函数(并且必须找出它们不存在。)

链接地址: http://www.djcxy.com/p/54155.html

上一篇: Can a C++ class member function template be virtual?

下一篇: Why do we not have a virtual constructor in C++?