成员函数模板不能为虚函数

https://blog.csdn.net/qaz2549066580/article/details/43988169 

#include<iostream>
#include<typeinfo>
using namespace std;
 
template<typename T>
class A{
    public:
        virtual void beep(){ }
        //成员函数模板不能为虚函数 
        template<typename T2>
        virtual void print(){ }
};
int main()
{
    system("pause");
    return 0;
}


这段代码不能成功编译。因为每个包含虚函数的类具有一个virtual table(vtable),包含该类的所有虚函数的地址,因此vtable的大小是确定的。成员函数模板只有被使用时才会被实例化,将其声明为虚函数会使vtable的大小不确定。所以,成员函数模板不能为虚函数。

再说具体一点,虚表在各个同类对象间共享,实际上存在全局区。详见:https://blog.csdn.net/songchuwang1868/article/details/89487787

既然在全局区,需要提前初始化好,也就是在对象实例化之前初始化好。但是在对象实例化后,可能以各种方式调用虚函,而模板在真正用到的时候才会实例化,模板虚函数的个数不确定。

猜你喜欢

转载自blog.csdn.net/songchuwang1868/article/details/89487441
今日推荐