【发布时间】:2011-12-19 05:45:15
【问题描述】:
模板的早期绑定和虚函数的后期绑定。那么,模板中包含虚函数是否安全?
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
};
【讨论】:
virtual关键字声明,所以它是一个虚函数模板。
是的,很安全。您可以通过派生一个类来使用它:
class derived : public base<int> {
virtual void fn(int) { std::cout << "derived"; }
};
当然,如果它包含任何其他虚拟函数(即,旨在用作基类),您通常也希望将 dtor 设为虚拟。
【讨论】:
template 类中的 virtual 函数没有安全问题。就像在普通的 class 中包含 virtual 函数一样好。
【讨论】: