模板子类覆盖父类的虚函数

时间:2010-05-06 03:56:56

标签: c++ templates virtual

以下代码使用gcc v4.3.3进行编译,并且模板化的子类似乎覆盖了父级中的虚函数,但是这不会破坏您不能拥有虚拟模板函数的规则吗?或者是其他发生的事情,我不明白?

class BaseClass
{
public:
  virtual void Func(int var)
  {
    std::cout<<"Base int "<<var<<std::endl;
  }

  virtual void Func(double var)
  {
    std::cout<<"Base double "<<var<<std::endl;
  }
};

template <class TT>
class TemplateClass : public BaseClass
{
public:
  using BaseClass::Func;
  virtual void Func(TT var)
  {
    std::cout<<"Child TT "<<var<<std::endl;
  }
};

int main(int argc, char **argv)
{
  BaseClass a;
  TemplateClass<int> b;
  BaseClass *c = new TemplateClass<int>;

  int intVar = 3;
  double doubleVar = 5.5;

  a.Func(intVar);
  a.Func(doubleVar);
  b.Func(intVar);
  b.Func(doubleVar);
  c->Func(intVar);
  c->Func(doubleVar);
  delete c;
}

然后输出:

Base int 3
底座双5.5 儿童TT 3
底座双5.5 儿童TT 3
基数加倍5.5

正如我所希望的那样,但我不确定它为什么会起作用。

2 个答案:

答案 0 :(得分:8)

类模板可能具有虚拟成员函数。

成员函数模板不能是虚拟的。也就是说,以下内容无效:

class C
{
public:
    template <typename T>
    virtual void f();
};

此外,如果派生类具有与基类中的虚函数同名的成员函数模板,则它不会覆盖虚函数。因此,如果TemplateClass::Func是成员函数模板,例如,

template <typename T>
void Func(T var) { /* ... */ }

它不会覆盖BaseClass::Func

答案 1 :(得分:2)

它不违反规则。实际规则是14.5.2 / 4:

  

成员函数模板不应是虚拟的。 [实施例:

template <class T> struct AA {
  template <class C> virtual void g(C); // error
  virtual void f(); // OK
};