如果模板包含虚函数,是否安全?

时间:2011-11-01 04:49:33

标签: c++ virtual

模板的早期绑定和虚函数的后期绑定。因此,如果模板包含虚函数,是否安全?

template<typename T> 
class base {
public:
    T data;
    virtual void fn(T t){}
};

3 个答案:

答案 0 :(得分:9)

这是完全安全的。实例化类模板后,它就像其他类一样成为普通类。

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
};

答案 1 :(得分:1)

是的,这很安全。你可以通过派生一个类来使用它:

class derived : public base<int> {
    virtual void fn(int) { std::cout << "derived"; }
};

当然,如果它包含任何其他虚拟函数(即,旨在用作基类),那么通常也希望将dtor设为虚拟函数。

答案 2 :(得分:0)

virtual类中的template函数没有安全问题。它与普通virtual内的class函数一样好。