我听说 C++ 类成员函数模板不能是虚拟的。这是真的?
如果它们可以是虚拟的,那么使用这种功能的场景示例是什么?
原文由 WannaBeGeek 发布,翻译遵循 CC BY-SA 4.0 许可协议
我听说 C++ 类成员函数模板不能是虚拟的。这是真的?
如果它们可以是虚拟的,那么使用这种功能的场景示例是什么?
原文由 WannaBeGeek 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
我查看了所有 14 个答案,有些原因是虚拟模板功能无法正常工作,有些则显示了解决方法。一个答案甚至表明虚拟类可以具有虚拟功能。这不应该太令人惊讶。
我的回答将直接给出标准为什么不允许虚拟模板函数的原因。既然这么多人抱怨。首先,我不敢相信有人评论说可以在编译时推导出虚函数。这是我听过的最愚蠢的话。
无论如何。我确信标准规定指向对象的 this 指针是其成员函数的第一个参数。
现在我们清楚了这一点。然后我们需要知道模板的转换规则。模板化参数极其受限于它可以隐式转换的内容。我不记得全部了,但您可以查看
C++ Primer
以获取完整参考。例如 T* 可转换为 const T*。数组可以转换为指针。但是,派生类不能作为模板参数转换为基类。所以我希望你明白我的意思。您不能拥有虚拟模板函数,因为就编译器而言,它们是两个完全不同的函数;因为他们隐含的这个参数是不同的类型。
虚拟模板无法工作的另一个原因同样有效。由于虚拟表是快速实现虚拟功能的最佳方式。