给出以下代码:
template <class T>
class A
{
public:
virtual void Foo() {};
virtual void Bar(const T& t) {};
};
Run Code Online (Sandbox Code Playgroud)
我知道Bar不允许上面的虚函数,因为模板是在编译时生成的,虚函数使用虚拟表,这在运行时发生,这意味着该虚拟函数没有有限数量的签名可以满足虚拟表.
但是,如果该功能具有不依赖于签名T,如Foo上述,将仍然是非法的?
我知道模板中不允许使用虚函数
不,你没有.类模板完全有可能具有虚拟成员函数 - 从该模板实例化的所有类都将具有一组有限数量的虚函数.甲成员函数模板不能是虚拟-这将意味着(潜在地)无穷多个虚拟功能.
所以在你的情况下,拥有一个虚拟的非模板成员函数就可以了.即使签名确实依赖,它也会一样好T.