模板的早期绑定和虚拟函数的后期绑定。因此,如果一个模板包含虚拟功能,是否安全?如果模板包含虚拟功能,它安全吗?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
模板的早期绑定和虚拟函数的后期绑定。因此,如果一个模板包含虚拟功能,是否安全?如果模板包含虚拟功能,它安全吗?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
这是完全安全的。一旦你实例化类模板,它就像其他类一样成为普通类。
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()
我还要指出的是,虽然它是允许虚拟功能在类模板,这是不允许的虚拟功能模板类内部(如下所示):
class A
{
template<typename T>
virtual void f(); //error: virtual function template is not allowed
};
有在template
类中不存在与virtual
函数相关的安全问题。它和正常的class
中的virtual
函数一样好。
是的,这是相当安全的。你会被具有类使用它从中获得:
class derived : public base<int> {
virtual void fn(int) { std::cout << "derived"; }
};
当然,如果它包含任何其他虚拟功能(即,意在作为一个基类),你一般要打dtor也是虚拟的。
您是否期望有问题?你会如何编写一个程序来检查它是否正常工作?当你运行该程序时会发生什么? –