作为模板参数传递时未调用的派生函子

时间:2017-02-14 20:55:08

标签: c++ templates functor

我在我的程序中使用了一个模式,它根据对象类型的要求调用不同类型的仿函数。在下面的代码中,b1对象使用派生的函子类型FunctorX显式实例化。但是当我在代码中调用时,将调用基函数而不是派生的函子。那是为什么?

struct Functor
{
  Functor() {}
  ~Functor() {}

  virtual int operator()() { return 33; }
};

struct FunctorX : public Functor
{
  FunctorX() : Functor() {}
  ~FunctorX() {}

  int operator()() { return 44; }
};

template< typename FunctorT >
struct B
{
  B( FunctorT FunctorArg ) : Functor { FunctorArg } {}
  ~B() {}

  FunctorT Functor;
};

int main()
{
  B< Functor > b1 { FunctorX() }; // initialize with derived functor. Derived functor gets instantiated.
  int num = b1.Functor(); // error: calls base functor, not derived functor

  return 0;
}

1 个答案:

答案 0 :(得分:0)

B<Functor>包含Functor类型的对象。您可以使用类型为FunctorX的对象初始化该对象,但在存储时,对象将被切片为Functor类型。就像unsigned int i = std::numeric_limits<unsigned long long>::max()一样,存储的值的类型为unsigned int,即使它使用类型为unsigned long long的值进行初始化。