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

新手上路,请多包涵

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

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

原文由 WannaBeGeek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 534
1 个回答

我查看了所有 14 个答案,有些原因是虚拟模板功能无法正常工作,有些则显示了解决方法。一个答案甚至表明虚拟类可以具有虚拟功能。这不应该太令人惊讶。

我的回答将直接给出标准为什么不允许虚拟模板函数的原因。既然这么多人抱怨。首先,我不敢相信有人评论说可以在编译时推导出虚函数。这是我听过的最愚蠢的话。

无论如何。我确信标准规定指向对象的 this 指针是其成员函数的第一个参数。

 struct MyClass
{
 void myFunction();
}

// translate to
void myFunction(MyClass*);

现在我们清楚了这一点。然后我们需要知道模板的转换规则。模板化参数极其受限于它可以隐式转换的内容。我不记得全部了,但您可以查看 C++ Primer 以获取完整参考。例如 T* 可转换为 const T*。数组可以转换为指针。但是,派生类不能作为模板参数转换为基类。

 struct A {};
struct B : A {};

template<class T>
void myFunction(T&);

template<>
void myFunction<A>(A&) {}

int main()
{
 A a;
 B b;

 myFunction(a); //compiles perfectly
 myFunction((A&)b); // compiles nicely
 myFunction(b); //compiler error, use of undefined template function
}

所以我希望你明白我的意思。您不能拥有虚拟模板函数,因为就编译器而言,它们是两个完全不同的函数;因为他们隐含的这个参数是不同的类型。

虚拟模板无法工作的另一个原因同样有效。由于虚拟表是快速实现虚拟功能的最佳方式。

原文由 user13947194 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题