虚函数不能模板化
编译器在编译一个类的时候,需要确定这个类的虚函数表的大小。一般来说,如果一个类有N个虚函数,它的虚函数表的大小就是N,如果按字节算的话那么就是4*N。
如果允许一个成员模板函数为虚函数的话,因为我们可以为该成员模板函数实例化出很多不同的版本,也就是可以实例化出很多不同版本的虚函数,那么编译器为了确定类的虚函数表的大小,就必须要知道我们一共为该成员模板函数实例化了多少个不同版本的虚函数。显然编译器需要查找所有的代码文件,才能够知道到底有几个虚函数,这对于多文件的项目来说,代价是非常高的,所以规定成员模板函数不能够为虚函数。
例如:
class Func
{
public:
template virtual T Add(const T& a,const T& b) {
T sum = a+ b;
return sum;
}
};
int main()
{
Func tmp;
int pResult = tmp.Add(1,2);
double qResult = tmp.Add(1.0,2.0);
}
那么编译器在编译Func类的时候,需要查看int mian 里面的具体调用,才知道会产生两个虚函数。一个是virtual int Add (const int &a, const int &b); 另一个是 virtual double Add (const double &a, const double &b)。当项目很大,文件特别多的时候,需要遍历完所有的文件才能确定实际会产生多少虚函数,所以这样编译的效率会非常的低。因此规定成员模板函数不能够为虚函数