template<typename T>
class weight
{
public:
void foo1(T a) { ++a; }
virtual void foo2(T b) { int temp = *b; }
};
int main()
{
// 编译失败
weight<int>* par=new weight<int>;
par->foo1(3);
return 0;
}
总结:
1.虚函数无法做成员模板;虚函数依赖虚表实现,如果virtual函数可以做成员模板则无法确定虚表大小
2.虚函数的模板实例化时机:在类模板的实例化后 所有虚函数必须实例化,无论此时虚函数是否被使用到;因为类模板实例化后,如果存在虚函数必须确定vptr以及虚表里面的虚函数地址;所以必须实例化每一个虚函数
测试环境:vs2019
参考:《深度探索C++对象模型》