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

Is it safe if a template contains virtual function?

本文关键字:安全 是否 函数 包含虚      更新时间:2023-10-16

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

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

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

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

当然,如果它包含任何其他虚函数(即,打算用作基类),则通常也希望使doctor为虚函数。

template类中没有与virtual函数相关的安全问题。这相当于在一个正常的class里面有一个virtual函数