【问题标题】:Is it safe if a template contains virtual function?如果模板包含虚函数是否安全?
【发布时间】:2011-12-19 05:45:15
【问题描述】:

模板的早期绑定和虚函数的后期绑定。那么,模板中包含虚函数是否安全?

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

【问题讨论】:

  • 您认为会有问题吗?你将如何编写一个程序来检查它是否正常工作?运行该程序时会发生什么?

标签: c++ virtual


【解决方案1】:

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

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

【讨论】:

  • 虚函数模板如何?
  • @krammer:因为它是一个函数模板,并且用virtual关键字声明,所以它是一个虚函数模板。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    template 类中的 virtual 函数没有安全问题。就像在普通的 class 中包含 virtual 函数一样好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多