模板的早期绑定和虚函数的后期绑定.因此,如果模板包含虚函数,是否安全?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
Run Code Online (Sandbox Code Playgroud)
这是完全安全的.实例化类模板后,它就像其他类一样成为普通类.
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
class derived : base<int> {
public:
virtual void fn(int t){} //override
};
base<int> *pBase = new derived();
pBase->fn(10); //calls derived::fn()
Run Code Online (Sandbox Code Playgroud)
我还想指出,虽然它允许在类模板中使用虚函数,但是不允许在类中使用虚函数模板(如下所示):
class A
{
template<typename T>
virtual void f(); //error: virtual function template is not allowed
};
Run Code Online (Sandbox Code Playgroud)